제45회 · LLM과 함께 배우는 생각그림

어텐션 히트맵은 어떤 토큰이 어느 토큰을 참고했는지 보여 줄까?

문장 속 토큰 관계를 색으로 펼치되, 어텐션 가중치를 곧바로 답변 이유나 인간의 주의로 해석하지 않습니다.

색이 진한 칸을 보기 전에 행과 열을 정한다

“책을 읽은 학생이 웃었다”를 모델에 넣고 어텐션을 꺼냈다고 하자. 정사각 격자의 한 행은 정보를 받는 질의 토큰 위치이고, 한 열은 그 행이 참조하는 키 토큰 위치다. 도구에 따라 축을 반대로 그릴 수 있으므로 제목과 범례에 “행=질의, 열=참조”를 반드시 적는다. 축을 확인하지 않으면 같은 칸을 정반대로 읽게 된다.

히트맵의 색은 특정 층과 특정 머리에서 나온 가중치를 나타낸다. 여러 층과 머리를 평균낸 값인지, 원시 어텐션인지, 잔차 연결을 함께 반영한 뒤의 값인지도 적어야 한다. 이 글의 수치는 공식 모델을 실행한 값이 아니라 표기법을 익히기 위해 만든 교육용 자료다.

생각그림 1 · 행·열과 가중치를 함께 읽는 기본 히트맵도표를 좌우로 움직여 전체 내용을 확인하세요.
책을읽은학생이웃었다책을1.000.000.000.00읽은0.360.640.000.00학생이0.080.460.460.00웃었다0.050.120.610.22
각 행은 어떤 참조 위치에 가중치를 나누었는지 보여 줍니다. 축과 집계 방식을 모르면 색만으로 관계를 말할 수 없습니다.

가중치는 점수의 소프트맥스 결과다

Transformer의 scaled dot-product attention은 질의 Q와 키 K의 내적을 특징 차원의 제곱근으로 나눈 점수에 소프트맥스를 적용하고, 그 가중치로 값 V를 가중합한다. 소프트맥스를 적용한 한 질의 행의 값은 보통 0 이상이며 합이 1이 된다. 따라서 같은 행 안에서 상대적으로 어디를 많이 참고했는지 읽을 수 있다.

합이 1이라는 성질은 표시한 자료가 마스킹 뒤 정규화된 가중치일 때 성립한다. 여러 머리를 합치거나 후처리한 값은 다른 범위를 가질 수 있다. 색 범례의 최소·최대가 행별인지 그림 전체인지도 공개해야 서로 다른 행의 진하기를 올바르게 비교할 수 있다.

생각그림 2 · 점수에서 가중합까지의 계산 관계
QKᵀ 점수
√d로 나눔
마스크 적용
행별 소프트맥스
V의 가중합
히트맵은 계산 중 가중치 한 장을 펼친 것입니다. 값 벡터와 잔차 경로까지 모두 보여 주는 그림은 아닙니다.

자기회귀 모델의 미래 칸은 가려진다

다음 토큰을 생성하는 디코더 자기주의에서는 현재 위치가 오른쪽의 미래 토큰을 미리 볼 수 없도록 인과 마스크를 쓴다. 그래서 행보다 오른쪽에 있는 칸은 계산에서 제외되고, 히트맵은 삼각형 모양으로 보인다. 가려진 칸은 가중치 0과 구분해 빗금이나 “마스크”로 표시하는 편이 정확하다.

0은 계산에 포함됐지만 소프트맥스 결과가 매우 작아 반올림된 값일 수 있다. 마스크는 애초에 선택 후보에서 제외된 위치다. 둘을 같은 흰색으로만 칠하면 “참조하지 않았다”와 “참조할 수 없었다”가 섞인다. 패딩 토큰 마스크도 별도 범례로 남긴다.

생각그림 3 · 관측 가능한 0과 마스크를 구분한다
표시계산 의미읽을 때 확인
0.00포함됐으나 매우 작은 값일 수 있음표시 자릿수
빗금인과·패딩 마스크로 제외마스크 종류
진한 색그 행 안의 큰 상대 가중치색 범위
빈칸자료 누락일 수도 있음결측 표기
흰 칸을 모두 같은 뜻으로 처리하지 않으면 마스크 구조와 작은 가중치를 분리해 읽을 수 있습니다.

층과 머리가 바뀌면 무늬도 바뀐다

다중 머리 어텐션은 같은 입력을 여러 투영 공간에서 병렬 계산한다. 한 머리는 가까운 이전 토큰에 큰 값을 둘 수 있고, 다른 머리는 문장 앞이나 구두점에 집중할 수 있다. 또한 아래층과 위층의 표현이 다르므로 같은 머리 번호라도 층이 달라지면 직접 비교할 대상이 아니다.

여러 머리를 평균하면 전체 경향을 한눈에 볼 수 있지만 특정 머리의 뚜렷한 패턴이 사라진다. 최대값만 취하면 작은 가중치가 지워지고, 서로 다른 머리에서 온 연결이 한 머리의 패턴처럼 보일 수 있다. 집계 그림과 원래 머리별 그림을 왕복할 수 있게 한다.

생각그림 4 · 머리별 보기와 집계 보기의 차이
층 2 · 머리 1가까운 이전 토큰에 큰 값
층 2 · 머리 6문장 첫 토큰에 큰 값
머리 평균공통 경향, 개별 패턴 약화
머리 최대강한 칸 보존, 출처 머리 혼합
한 장의 평균 히트맵을 “모델의 어텐션” 전체라고 부르지 않고 층·머리·집계 방식을 함께 적습니다.

서로 다른 문장 길이는 같은 색 범례로 비교한다

네 토큰 문장과 스무 토큰 문장은 한 행의 합이 모두 1이어도 값이 퍼지는 정도가 다르다. 문장이 길어지면 균등 분포의 기준값은 1/4에서 1/20로 작아진다. 각 그림의 최댓값을 자동으로 진한색에 맞추면 실제 값 0.18이 0.70처럼 강해 보일 수 있다.

비교 목적이라면 고정된 색 범위, 실제 수치 표시, 행 엔트로피 같은 보조값을 함께 둔다. 다만 엔트로피가 낮다고 중요한 이유를 찾았다고 말할 수는 없다. 그것은 가중치가 몇 칸에 모였는지 요약할 뿐, 출력 변화에 대한 인과 기여를 직접 측정하지 않는다.

생각그림 5 · 문장 길이와 색 범위의 비교 조건
비교 항목고정할 것함께 기록
두 문장층·머리·모델·토큰화각 문장 토큰 수
두 머리층·입력·색 범위머리 번호
두 층머리 선택·집계법잔차 포함 여부
두 모델토큰화가 다를 수 있음모델·버전
비교 가능성은 색의 선명함이 아니라 같은 조건과 실제 수치에서 나옵니다.

LLM에는 축·범위·금지 해석을 명시한다

어텐션 배열만 붙여 “분석해 줘”라고 하면 모델이 문법 관계나 답변 이유를 지어낼 수 있다. 입력 토큰, 모델과 버전, 층, 머리, 배열 모양, 마스크, 집계 여부를 제공하고 먼저 행 합과 배열 크기를 검사하게 한다. 그다음 관찰 가능한 패턴과 해석 가설을 분리한다.

요청문에는 “진한 칸을 인간의 관심, 중요도, 인과적 설명으로 단정하지 말 것”을 넣는다. 토큰 분할 때문에 한 단어가 여러 토큰이면 단어 수준 집계 규칙도 요구한다. 원시 토큰을 보존하고 집계 전후 값을 나란히 보여 주면 번역된 단어 라벨이 원래 계산 위치를 가리는 일을 줄인다.

생각그림 6 · 어텐션 자료를 도표로 옮기는 검증 순서
토큰·모양 확인
층·머리 고정
행 합·마스크 검사
색 범위 결정
관찰과 해석 분리
도표 작성보다 먼저 배열이 무엇을 나타내는지 확정하면 그럴듯한 오해를 줄일 수 있습니다.

어텐션은 설명의 증거 하나이지 설명 전체가 아니다

Jain과 Wallace는 표준 어텐션 가중치가 입력 중요도와 일치하지 않거나, 매우 다른 어텐션 분포가 비슷한 예측을 낼 수 있음을 여러 NLP 과제에서 보였다. 따라서 한 칸의 값이 높다는 사실만으로 그 토큰이 출력의 원인이라고 단정할 수 없다. 가중치는 해당 어텐션 모듈 안에서 V를 섞는 비율이다.

여러 층에서는 잔차 연결과 뒤이은 비선형 계산으로 정보가 계속 섞인다. Abnar와 Zuidema는 원시 어텐션보다 층 사이 흐름을 근사하는 rollout과 flow를 제안했지만, 이것도 사후 분석 방법이다. 히트맵에는 “계산 가중치 관찰”이라는 범위와 추가 검증 필요를 적는다.

생각그림 7 · 히트맵이 말하는 것과 추가 검증이 필요한 것
히트맵으로 관찰히트맵만으로 단정하기 어려움
특정 층·머리의 가중치답변이 나온 충분한 이유
행 안의 상대적 집중토큰 제거 시 출력 변화
마스크와 위치 패턴모델의 숨은 생각 과정
집계 전후 차이사실 판단의 근거 출처
주의 깊은 해석은 그림의 가치를 낮추지 않습니다. 오히려 측정한 값과 질문을 정확히 맞춥니다.

수정 전후는 축과 해석 문장에서 갈린다

수정 전 그림은 축 이름 없이 색만 보여 주고 “모델이 학생을 가장 중요하게 생각했다”라고 적었다. 어느 층·머리인지, 값의 합이 얼마인지, 미래 칸이 마스크인지 알 수 없었다. 색 범위도 각 그림에 맞춰 자동 조정돼 두 문장을 비교할 수 없었다.

수정 후 그림은 행=질의, 열=참조를 명시하고 모델·층·머리·토큰화·마스크·색 범위를 붙였다. 캡션은 “웃었다 위치가 학생이 위치에 0.61을 배정했다”처럼 관찰만 적고, 문법적 관계나 출력 기여는 추가 실험 과제로 남겼다.

생각그림 8 · 과장된 설명을 검증 가능한 관찰로 고친다
수정 전색만 있고 축·층·머리 없음
수정 전“모델이 중요하게 생각”
수정 후행·열·값·마스크·범례
수정 후관찰과 해석 가설을 분리
정확한 캡션은 사람이 의도를 읽어 내는 표현보다 배열에서 다시 확인할 수 있는 문장을 씁니다.

공개 전에는 수치와 그림을 역방향으로 확인한다

최종 검수는 배열의 한 행을 골라 합을 다시 계산하고, 최댓값의 행·열 위치가 색과 숫자에 맞는지 확인한다. 마스크된 칸이 범례대로 표시되는지, 토큰 순서가 원문과 같은지, 특수 토큰이 빠졌다면 어떤 규칙으로 제외했는지도 살핀다. 모바일에서는 표를 작게 축소하지 않고 가로 스크롤과 안내를 제공한다.

마지막으로 캡션의 모든 해석어에 질문을 던진다. “중요하다”는 무엇에 대한 중요도인가, “연결됐다”는 계산 연결인가 문법 관계인가, “설명한다”는 예측 변화를 검증했는가. 답할 수 없으면 관찰 문장으로 낮추거나 추가 분석 링크를 붙인다.

생각그림 9 · 어텐션 히트맵 공개 전 검사표
검사통과 기준미통과 행동
배열토큰 수×토큰 수와 일치축·누락 토큰 수정
행 합허용 오차 안에서 1마스크·집계법 확인
색 범위숫자·범례와 일치고정 범위로 재작성
해석계산 관찰과 인과 주장 분리캡션 완화
모바일글자 유지·내부 스크롤그림 분할
수치에서 색으로, 색에서 캡션으로, 캡션에서 수치로 돌아올 수 있어야 검수가 끝납니다.

복사해서 쓸 수 있는 LLM 요청문

아래 요청문은 교육용 예시다. 원문을 함께 제공하고, 모델이 빈칸을 추측하지 않도록 금지 조건을 넣었다. 결과를 받으면 원문 문장과 노드·선의 대응을 사람이 다시 확인한다.

다음 어텐션 배열을 히트맵으로 정리해 줘.
1. 모델·버전·입력 토큰·층·머리·배열 모양을 표에 먼저 적는다.
2. 행은 질의 토큰, 열은 참조 토큰으로 쓰되 원자료 축이 반대면 변환 사실을 밝힌다.
3. 각 행의 합, 음수·결측값, 인과·패딩 마스크를 검사한다.
4. 색 범위를 0–1로 고정하고 각 칸에 값을 소수 둘째 자리까지 표시한다.
5. 머리별 원본과 평균 그림을 분리하고 집계 방식을 캡션에 적는다.
6. 진한 칸을 인간의 관심, 답변 이유, 인과적 중요도로 단정하지 않는다.
7. 관찰 가능한 패턴과 추가 검증이 필요한 해석을 표로 나눈다.

[입력 토큰과 어텐션 배열] …
생각그림 10 · 요청문에서 결과와 검토까지
원문 붙이기
도표 목적 명시
추정 금지
문장별 대조
요청문은 도표를 자동으로 진실로 만들지 않습니다. 원문과 결과를 왕복해 확인하는 절차가 핵심입니다.

직접 실습하고 결과를 읽기

이 실습은 브라우저 안에 준비한 교육용 자료만 사용한다. 외부 LLM을 호출하거나 실제 기관 자료를 조회하지 않는다. 입력을 바꾸어 결과가 어떻게 달라지는지 보고, 설명과 맞지 않는 결과가 나오면 어떤 정보가 빠졌는지 적어 본다.

한 행을 골라 값의 합과 가장 큰 참조 위치를 확인하세요.

자료와 출처

아래 자료는 이번 글의 정의와 표기법을 확인하는 데 사용했다. 생각그림과 사례 문장은 원자료를 복제하지 않고 이 글의 교육 목적에 맞게 새로 구성했다.