요약
# 트랜스포머의 원리와 전체 처리 흐름
⏱ 02:05이 강의는 LLM의 기반 구조와 학습·응용을 이해하기 위한 첫 수업이다. 머신러닝, 신경망, 행렬 곱셈의 기초를 전제로 NLP 과제에서 트랜스포머까지 연결한다. 수업은 금요일 15시 30분~17시 20분에 열리는 2학점 과목이며 녹화와 슬라이드를 제공한다. 숙제나 코딩 시험 없이 중간·기말고사를 각각 50% 반영한다. NLP는 문장 감정 같은 하나의 결과를 예측하는 분류, 개체명 인식처럼 여러 토큰을 분류하는 과제, 번역·질의응답·요약·코드 작성 같은 생성으로 나눠 볼 수 있다. 분류에서는 정확도 외에 정밀도·재현율·F1을 확인해야 한다. 양성이 99%인 데이터에서는 모두 양성이라고 예측하는 모델도 높은 정확도를 얻기 때문이다.
⏱ 23:08모델은 숫자를 처리하므로 텍스트를 먼저 토큰으로 나누고 벡터로 표현한다. 단어 단위 토큰화는 간단하지만 bear/bears, run/runs 같은 형태의 공통점을 직접 활용하지 못하고 미등록 단어인 OOV가 생기기 쉽다. 서브워드는 공통 부분을 활용하고 OOV 위험을 낮추지만 시퀀스가 길어진다. 문자 단위는 철자·대소문자 오류에 강한 대신 시퀀스가 훨씬 길어지고 문자 하나의 의미를 해석하기 어렵다. 토큰 수가 늘면 처리 비용도 커지므로 적절한 절충이 필요하다. 강의에서 제시한 어휘 크기의 대략적 규모는 단일 언어 수만 개, 다국어·코드 모델 수십만 개다. 원핫 벡터는 서로 직교하므로 의미적 유사성을 표현하기 어렵다. 코사인 유사도는 노름으로 정규화하여 벡터의 방향을 비교하는 척도다. 노름에 정보가 있는지는 학습 방식에 따라 판단해야 하며 내적을 쓸 수도 있다.
⏱ 38:43Word2vec은 주변 단어로 목표 단어를 예측하는 CBOW, 목표 단어로 주변 단어를 예측하는 스킵그램 같은 대리 과제로 임베딩을 학습한다. 강의의 작은 신경망 예에서는 다음 단어 예측과 교차 엔트로피·역전파로 가중치를 갱신하고 은닉 표현을 임베딩으로 취한다. 목적은 대리 과제 자체보다 유용한 표현을 얻는 것이다. 차원은 과제의 복잡도와 지연·비용 사이에서 정하며 수백~수천 차원이 흔하다. 단어 표현을 평균 내면 순서와 문맥을 잃는다. RNN은 은닉 상태로 지금까지의 시퀀스를 전달하고, LSTM은 셀 상태를 더해 기억을 보완한다. 그러나 긴 의존 관계에서는 연속적인 곱으로 기울기가 소실하거나 폭발할 수 있고, 앞선 상태를 먼저 계산해야 하므로 병렬화에도 제약이 있다.
⏱ 1:05:14어텐션은 현재 예측과 필요한 입력 정보 사이에 직접 연결을 만든다. 2017년 트랜스포머는 자기 어텐션으로 모든 입력 토큰의 관계를 함께 계산한다. 덕분에 같은 bank라도 강둑과 은행이라는 문맥에서 다른 표현을 얻을 수 있다. 입력 표현을 학습 가능한 행렬로 투영해 Q·K·V를 만들고, softmax(QKᵀ/√d_k)V를 계산한다. 쿼리와 키의 내적은 관련성을, 소프트맥스는 각 행의 가중치 분포를 만들며, 값들의 가중합이 결과 표현이 된다. √d_k로 나누는 것은 차원 증가에 따라 커지는 내적의 크기를 조절하기 위해서다. 다중 헤드는 서로 다른 투영으로 이 계산을 병렬 수행한 뒤 결과를 연결하고 W_O로 원래 차원에 투영한다. 헤드가 달라야 한다는 강제 제약은 없지만 학습 과정에서 서로 다른 유용한 표현을 얻는 경향이 있다.
⏱ 1:38:11번역용 트랜스포머는 인코더와 디코더를 각각 N개 쌓는다. 토큰 임베딩에 사인·코사인 기반 위치 정보를 원소별로 더하고, 인코더 자기 어텐션과 FFN으로 문맥 표현을 만든다. 디코더는 BOS에서 시작해 현재와 이전 토큰만 보는 마스크 자기 어텐션을 수행한다. 이어 교차 어텐션에서 디코더 표현을 쿼리로, 인코더 출력을 키와 값으로 사용하고 FFN을 거친다. 마지막 선형 투영과 소프트맥스로 다음 토큰 분포를 얻어 반복하며 EOS에서 종료한다. 생성 평가는 번역의 여러 정답 가능성 때문에 어렵다. BLEU·ROUGE는 기준 텍스트가 필요하고 높을수록 좋으며, 모델 확률을 보는 퍼플렉시티는 낮을수록 좋다. 기준 번역문을 모으는 데 시간과 비용이 들므로, 이후에는 LLM을 활용하는 기준 텍스트 없는 평가도 다룬다. 레이블 스무딩은 정답에 1−ε, 나머지에 ε/(V−1)을 배정해 과도한 확신을 줄인다. 이는 소프트맥스가 아니라 목표 레이블을 바꾸는 기법이며, 원 논문에서는 BLEU 개선에 도움이 되었다.
⏱ 00:061. 강의 소개와 수강 대상

⏱ 00:06안녕하세요. CME 295, 「트랜스포머와 대규모 언어 모델」 강의에 오신 것을 환영합니다. 제 이름은 아프신(Afshine)이고, 뒤에 있는 셔빈(Shervine)과 함께 수업을 진행합니다. 먼저 저희를 소개하겠습니다. 저희는 쌍둥이 형제로, 배경도 비슷합니다. 둘 다 프랑스의 에콜 상트랄 파리(Centrale Paris)를 졸업한 뒤 저는 MIT로, 셔빈은 스탠퍼드의 ICME 석사 과정으로 진학했습니다. 산업계 경력도 비슷합니다. 제가 우버에 먼저 입사한 뒤 셔빈이 합류했고, 셔빈이 구글로 옮기자 저도 구글로 갔습니다. 아주 최근에는 제가 넷플릭스에 합류했고 셔빈도 넷플릭스로 왔습니다. 저희는 대규모 언어 모델을 연구·개발해 왔으며, 기술적 배경도 주로 LLM에 맞춰져 있습니다.
⏱ 01:14왜 이 강의를 하게 되었을까요? 저희는 2020년부터 자연어 처리(NLP)를 전문 분야로 삼았고, 이 수업을 해마다 워크숍 형태로 진행해 왔습니다. 2021년, 2022년, 2023년, 2024년에 워크숍을 열었는데, 2022년에 ChatGPT가 등장하면서 LLM에 대한 관심이 크게 늘었습니다. 지난봄에 처음으로 이 내용을 스탠퍼드 정규 과목인 CME 295로 개설했고, 이번이 두 번째 개설입니다. 이제 LLM은 사실상 어디에나 있습니다. 이 강의의 목표는 두 가지입니다. 하나는 그 작동을 가능하게 하는 내부 원리를 배우는 것으로, 기반 아키텍처인 트랜스포머를 살펴볼 것입니다. 다른 하나는 LLM을 어떻게 학습시키고 어디에 적용하는지 이해하는 것입니다.
⏱ 02:31이 강의가 자신에게 맞는지 고민한다면, 이 분야에 관심이 있는 분 전반에게 적합하다고 말씀드리고 싶습니다. 연구 과학자나 머신러닝 과학자를 진로로 생각하는 분, LLM을 활용하는 개인 프로젝트를 만들면서 무엇이 잘되고 무엇이 안 되는지와 주의점을 알고 싶은 분 모두 해당합니다. 다른 분야에서 일하면서 AI, 생성형 AI, LLM이 어떻게 작동하고 자기 분야에 어떻게 적용할 수 있는지 알고 싶은 분에게도 도움이 될 것입니다. 선수지식으로는 최소한 머신러닝의 기초, 즉 모델을 어떻게 학습시키고 신경망이 무엇인지 정도를 알고, 행렬 곱셈 같은 기본 선형대수를 이해하면 좋습니다. 아직 역량을 쌓아 가는 중이어도 괜찮습니다. 저희가 도와드리겠습니다. 말씀드린 것은 이상적인 선수지식입니다.
⏱ 03:552. 수업 운영과 학습 자료

⏱ 03:55수업은 매주 금요일 오후 3시 30분부터 5시 20분까지 이 강의실에서 열립니다. 2학점 과목이며, 문자 성적 방식이나 학점 인정·불인정 방식 중 선택할 수 있습니다. 보시다시피 수업은 녹화합니다. 이 시간에 참석하기 어려운 경우를 위해 매주 금요일 밤이나 토요일에 녹화 영상을 제공하겠습니다. 이번 학기 평가는 시험 두 번으로 진행합니다. 중간고사는 다섯 번째 수업일인 10월 24일에 보고, 기말고사는 12월 8일이 포함된 주에 볼 예정입니다. 기말고사의 정확한 날짜는 아직 정해지지 않았으므로 추후 알려드리겠습니다.
⏱ 05:14매 강의의 슬라이드와 녹화 영상은 웹사이트에 올립니다. 앞으로 다룰 주제를 확인할 수 있는 강의계획서도 그곳에 있습니다. 교재는 『Super Study Guide: Transformers & LLMs』입니다. 살펴보고 싶은 분을 위해 여기 한 권을 가져왔습니다. 수업에서 다루는 개념 상당수가 책에도 있으므로 수업을 따라가는 데 도움이 될 것입니다. 또 전체 수업을 아주 짧게 압축한 VIP 치트시트도 만들었습니다. GitHub에서 볼 수 있고 여러 언어로 번역해 두었습니다. 여러분의 언어가 없다면 알려 주세요. 함께 번역하는 일도 기꺼이 하겠습니다.
⏱ 06:19공지사항은 Canvas에 게시합니다. 질문은 저희에게 직접 하셔도 되고, Canvas의 Ed 탭에서 질문을 올려도 됩니다. 익숙하실 텐데, 그 탭을 눌러 질문을 작성하면 셔빈과 제가 답변하겠습니다. 연락용 메일링리스트도 있으며, 저희는 두 명뿐이니 직접 연락해도 됩니다. 운영에 관해 지금까지 질문이 있나요? 한 가지 빠뜨린 점이 있습니다. 녹화 영상에서는 학생의 질문이 잘 들리지 않을 수 있으므로 제가 질문을 반복해서 말하겠습니다. 조금 어색하게 들리더라도 영상 시청자를 위한 것이고, 잊지 않도록 하겠습니다.
⏱ 07:293. 운영 관련 질의응답과 강의의 출처

⏱ 07:29“시험에 코딩 문제가 나오나요?”라는 질문입니다. 답은 아니요입니다. 시험은 수업에서 다루는 개념에만 초점을 맞춥니다. 여러분을 함정에 빠뜨리려는 시험이 아닙니다. 수업을 따라오고 슬라이드와 개념을 살펴보면 괜찮을 것입니다. 다음은 “수강 대기 명단에 있으면 어떻게 하나요?”라는 질문입니다. 경험상 학생들이 시간표를 확정하는 과정에서 일부는 수강을 취소하고 일부는 남습니다. 계속 대기 상태라면 저희에게 와서 말씀해 주세요. 현재 대기자가 여섯 명 정도이므로 잘 해결될 가능성이 높다고 생각합니다. “슬라이드는 어디에 있나요?” 웹사이트에 올리고 Canvas에도 링크를 게시하겠습니다.
⏱ 08:40시험별 반영 비율에 관한 질문도 있었습니다. 숙제는 없고, 중간고사 50%, 기말고사 50%입니다. 그 밖의 항목에는 성적 비중이 없습니다. 특히 이 수업 시간이 다른 일정과 겹친다면 녹화를 제공한다는 점을 기억해 주세요. 현장 수업에 참석하지 못해도 괜찮습니다. “기말고사는 강의 후반부만 다루나요?” 아직 시험을 출제하지 않았지만 그렇게 하는 방안을 생각하고 있습니다. 아마 기말고사는 후반부 주제를 중심으로 볼 것입니다. 정리하면 중간고사 50%, 기말고사 50%이며, 재미있는 수업이 될 것입니다.
⏱ 09:40이제 강의를 시작하겠습니다. 앞으로 무언가를 설명할 때 슬라이드 아래쪽에 출처를 표시할 것입니다. 인용한 자료의 기여를 인정하기 위한 것이기도 하고, 여러분이 관심 있는 내용을 더 깊게 찾아볼 수 있게 하기 위한 것이기도 합니다. 주당 두 시간, 전체 9~10주 정도로는 모든 내용을 다룰 시간이 턱없이 부족합니다. 또 한 가지 미리 말씀드리면 이 분야에는 약어가 아주 많습니다. 저도 처음에는 그 약어들이 무서웠습니다. 수업이 끝날 즈음에는 각 약어가 무엇을 뜻하고 어떤 개념에 대응하는지 머릿속에 연결 지도가 생기면 좋겠습니다. 그런 지도가 만들어졌다면 저희가 수업을 잘한 것이겠지요.
⏱ 10:464. 자연어 처리의 세 가지 과제 유형

⏱ 10:46아무것도 모르는 상태에서 출발한다고 가정하고, 아주 큰 그림부터 자연어 처리 전반을 살펴보겠습니다. 첫 약어는 NLP로, Natural Language Processing, 즉 자연어 처리입니다. 텍스트를 조작하고 텍스트로 여러 계산을 하는 분야입니다. 크게 보면 NLP 과제는 세 가지 범주로 나눌 수 있습니다. 첫째는 분류입니다. 텍스트를 입력으로 받아 어떤 것을 예측합니다. 예를 들어 영화 리뷰가 긍정적인지, 부정적인지, 중립적인지 예측할 수 있습니다. 사용자가 무엇을 하려는지 알아내는 의도 탐지도 있습니다. “내일 알람을 설정하고 싶어”라는 말의 의도는 ‘알람 생성’입니다. 프랑스어로 쓴 글을 프랑스어라고 알아보는 언어 탐지나 토픽 모델링도 이 범주에 속합니다.
⏱ 12:09둘째는 여러 항목을 분류하는 과제입니다. 여기서도 입력은 텍스트이지만 하나 이상의 대상을 예측합니다. 대표적인 과제가 개체명 인식, Named Entity Recognition, 줄여서 NER입니다. 입력 텍스트의 특정 단어에 표시를 붙여, 예를 들어 어떤 것이 장소인지 시간인지 등을 식별합니다. 언어학적인 과제들도 있습니다. 요즘은 예전만큼 유행하지 않지만 10년 전에는 많이 연구했습니다. 품사 태깅은 어떤 단어가 명사이고 동사인지 등을 알아내는 일이며, 의존 구문 분석이나 구성 구문 분석처럼 문장의 구조를 분석하는 과제도 있습니다.
⏱ 13:13마지막 범주는 요즘 특히 인기 있는 생성입니다. 입력도 텍스트이고 출력도 텍스트입니다. 출력 길이는 가변적이어서 결과가 얼마나 길지 미리 알 수 없습니다. 여기에는 영어를 독일어로 옮기는 것 같은 기계 번역이 포함됩니다. 여러분이 쓰는 ChatGPT나 Gemini 같은 비서의 질의응답도 마찬가지입니다. 질문을 입력하면 답을 받습니다. 기사를 요약하는 요약 과제, 코드나 시를 만드는 생성 과제도 있고, 그 밖에도 다양한 것이 가능합니다. 이제 각 범주를 하나씩 예로 들어 사람들이 보통 어떤 문제를 다루는지 살펴보겠습니다.
⏱ 14:215. 분류의 평가와 기계 번역

⏱ 14:21첫 번째 범주인 분류는 감정 추출 과제로 설명하겠습니다. “이 곰 인형은 정말 귀엽다”라는 문장이 있다면 모델이 이를 긍정적인 감정으로 예측하기를 바랍니다. 보통 감정 추출용 데이터셋을 사용합니다. 앞서 언급한 영화 리뷰에는 IMDb 리뷰가 있고, 상품 평가에는 아마존 리뷰가 있습니다. 트윗도 쓸 수 있는데, 지금은 X라고 하니 X 게시물이라고 해야겠네요. 이런 출력은 일반적인 분류 평가 지표로 평가합니다. 정확도(accuracy)는 전체 관측치 중 올바르게 예측한 비율입니다.
⏱ 15:21두 가지 핵심 지표도 다시 설명하겠습니다. 모두가 이미 아는지는 모르겠지만, 정밀도(precision)는 모델이 양성이라고 예측한 것들 중 실제로 맞은 것이 얼마나 되는지 나타냅니다. 재현율(recall)은 실제 양성인 것들 가운데 얼마나 많이 양성이라고 올바르게 예측했는지 나타냅니다. F1 점수는 정밀도와 재현율의 조화평균으로, 둘을 하나의 숫자로 나타냅니다. 왜 이렇게 여러 지표가 필요할까요? 어떤 과제나 데이터셋에서는 클래스의 비율이 매우 불균형하기 때문입니다. 예를 들어 전체 데이터의 99%가 양성이고 1%만 음성일 수 있습니다.
⏱ 16:20이때 정확도만 사용하면 매우 오해하기 쉽습니다. 모든 것을 다수 클래스로 예측하는 모델도 정확도상으로는 훌륭한 분류기처럼 보이지만 실제로는 그렇지 않습니다. 정밀도와 재현율이 중요한 이유입니다. 이어서 두 번째 NLP 범주, 즉 입력 텍스트에 대해 여러 항목을 예측하는 과제로 가겠습니다. NER에서는 앞서 말했듯 특정 단어의 범주를 식별합니다. 여기의 예에서는 ‘곰 인형’을 하나의 개체로 알아내고 싶습니다. 평가에는 분류 지표를 쓰되 문장 수준이 아니라 토큰 수준이나 개체 유형 수준에서 계산합니다. 예를 들어 ‘장소’라는 범주가 있다면 그 범주의 단어를 얼마나 잘 예측하는지 알아보도록 지표를 모아 계산합니다.
⏱ 17:47마지막은 현재 가장 인기 있는 범주인 텍스트 입력·텍스트 출력 과제입니다. 출발 언어의 텍스트를 목표 언어로 옮기는 기계 번역으로 설명하겠습니다. 영어에서 프랑스어로 번역하는 예를 보면 “A cute teddy bear is reading”은 “Un ours en peluche mignon lit”, 즉 “귀여운 곰 인형이 책을 읽고 있다”가 됩니다. 이 과제는 텍스트가 서로 짝을 이루어야 하므로 데이터셋을 얻기가 더 어렵습니다. 널리 쓰이는 데이터셋으로 WMT가 있는데, Workshop on Machine Translation의 약자입니다. 여러 언어 사이의 짝지어진 문장열이 들어 있으며, 예를 들어 유럽 의회 데이터셋에서 가져온 영어·프랑스어 쌍이나 영어·독일어 쌍이 있습니다. 이런 모델의 성능을 평가하는 일은 훨씬 까다롭습니다. 짐작하듯 같은 내용을 번역하는 방법이 여러 가지이기 때문입니다. 이 강의실에도 두 언어나 세 언어를 하는 분들이 많을 텐데, 그런 분들이라면 이 점을 이해하실 것입니다.
⏱ 19:076. 생성 평가 지표와 언어 모델의 발전

⏱ 19:07바로 그런 점이 번역 평가를 어렵게 합니다. 과거에는 여러 규칙 기반 지표를 썼습니다. 들어 보셨을 법한 BLEU는 Bilingual Evaluation Understudy의 약자이며, 번역문이 기준 텍스트와 얼마나 잘 맞는지 측정합니다. ROUGE도 비슷하지만 여러 지표로 이루어진 묶음이며 다른 방식으로 일치도를 포착합니다. 머신러닝 연구자들은 재미있는 이름을 붙이기도 합니다. 프랑스어를 아는지 모르겠지만 bleu는 파란색, rouge는 빨간색이라는 뜻입니다. 이름에 재미를 더한 것이겠지요. 다만 이 지표들은 항상 기준 텍스트, 즉 정답 레이블이 필요합니다. 실제로 레이블을 확보하는 데는 시간과 비용이 많이 듭니다.
⏱ 20:21이후 수업에서 보겠지만, LLM 분야가 발전하면서 기준 텍스트에 의존하는 지표에서 벗어나 기준 텍스트 없이 평가하는 방식으로 갈 수 있게 되었습니다. 이는 나중에 다루겠습니다. 또 사람들이 때때로 쓰는 지표는 퍼플렉시티(perplexity)입니다. 모델이 출력하는 확률만을 보고, 모델이 그 출력에 얼마나 놀라는지를 수치화합니다. BLEU와 ROUGE는 높을수록 좋고, 퍼플렉시티는 낮을수록 좋습니다. LLM은 2022년 이후 뜨거운 주제가 되었지만, 이 분야의 역사는 훨씬 깁니다. 잠시 뒤 볼 어떤 모델 계열은 이미 1980년대에 구상되었고, 1990년대에는 LSTM이 등장했습니다.
⏱ 21:41하지만 당시에는 인터넷이 없었고 계산 자원도 많지 않았습니다. 이것이 오늘날 같은 모델을 학습하지 못하게 한 제약 중 하나였습니다. 더 최근에는 여러 발전이 있었습니다. Word2vec은 의미 있는 임베딩을 계산하는 선구적인 연구 중 하나였으며, 곧 살펴보겠습니다. 2017년에는 트랜스포머 논문이 발표되었고, 사실상 오늘날 보는 모든 모델의 기반이 되었습니다. 이후 모델은 계산량과 학습 데이터 양 양쪽에서 규모가 커졌고, 이렇게 대규모 언어 모델, LLM이라고 부르는 모델들이 등장했습니다. 이는 대체로 2020년대의 이야기입니다. 큰 그림에 관해 질문이 있나요? 괜찮다면 계속하겠습니다.
⏱ 22:567. 토큰화의 단위와 절충 관계

⏱ 22:56먼저 질문해 볼 것은 텍스트를 처리하는 모델에 텍스트를 어떻게 전달하느냐입니다. 모델은 숫자를 이해하지 텍스트 자체를 이해하지는 않습니다. 따라서 텍스트를 모델이 이해할 수 있는 수량적 형태로 바꾸어야 합니다. “A cute teddy bear is reading”이라는 문장을 예로 들어, 어떤 단위로 잘라 모델에 전달할지 생각해 봅시다. 이 과정이 토큰화(tokenization)이며, 텍스트를 어떤 단위에 따라 나누는 것입니다. 완전히 임의로 나눌 수도 있습니다. ‘a’를 한 단위, ‘cute’를 또 한 단위, ‘teddy bear’를 한 단위로 삼는 식입니다. 이 텍스트 단위를 토큰(token)이라고 하므로 과정의 이름도 토큰화입니다.
⏱ 24:19다른 방법은 단어별로 나누는 것입니다. 하지만 각 방법에는 장단점이 있습니다. 최종 목표 중 하나는 각 토큰을 의미 있는 방식으로 표현하는 것입니다. 단어 단위 방식의 단점은 비슷하게 생긴 단어도 서로 다른 토큰이 된다는 것입니다. 그러면 비슷하지만 별개인 토큰들의 임베딩을 각각 계산하면서, 그 임베딩이 비슷해지도록 만들어야 합니다. 예를 들어 ‘bear’와 복수형 ‘bears’는 단수와 복수의 차이만 있는 매우 비슷한 단어입니다. 그러나 단어 단위 토큰화는 둘을 별개의 대상으로 취급합니다. 동사 ‘run’과 ‘runs’ 같은 활용형도 마찬가지입니다.
⏱ 25:42그래서 사람들이 연구한 것이 서브워드 토큰화입니다. 단어의 공통 부분이나 어근을 활용하여 여러 단어가 공유하는 부분을 찾습니다. ‘bear’와 ‘bears’라면 ‘bear’ 부분을 공유할 수 있습니다. 장점은 단어의 공통 뿌리를 활용한다는 것이고, 단점은 토큰열이 더 길어진다는 것입니다. 왜 길어지는 것이 단점인지 미리 말하자면, 이 모델들의 복잡도가 시퀀스 길이에도 좌우되기 때문입니다. 처리해야 할 토큰이 많을수록 모델은 그 모든 토큰을 처리해야 하므로 실행 시간이 길어집니다. 즉 어근을 활용한다는 장점과 시퀀스가 길어진다는 단점 사이의 절충입니다.
⏱ 27:05마지막 방법은 문자 단위로 나누는 것입니다. 메시지를 쓸 때 우리도 때때로 철자를 틀립니다. 서브워드 토큰화로는 철자가 틀린 단어를 알아보지 못할 수 있지만, 문자 단위 토큰화는 이런 경우를 다룰 수 있습니다. 다만 시퀀스가 훨씬 길어져 모델의 처리 시간이 많이 늘어납니다. 또 각 토큰을 표현하려 할 때 문자 하나의 표현이 무엇을 의미하는지 알기 어렵습니다. 가령 문자 U의 표현은 무엇을 뜻할까요? 해석하기가 아주 어렵습니다.
⏱ 28:188. 어휘 밖 토큰과 토큰화의 정리

⏱ 28:18간단히 정리하겠습니다. 단어 단위는 텍스트를 나누는 매우 단순한 방법이지만 공통 어근을 활용하지 못합니다. 또 아직 언급하지 않은 용어가 있습니다. 텍스트를 잘라서 추론, 즉 예측할 때 사용하려면 그 토큰이 학습 시점의 어휘에 있어야 합니다. 추론할 때 문장을 단어별로 나누었는데 학습 중 본 적 없는 단어가 나오면 ‘알 수 없음’으로 표시해야 합니다. 이를 OOV, Out Of Vocabulary, 즉 어휘 밖 항목이라고 합니다. 서브워드 토큰화는 다행히 이 문제를 완화합니다. OOV 위험이 더 낮지만 완전히 없어지는 것은 아니며, 앞서 말한 대로 단어의 어근을 활용할 수 있습니다.
⏱ 29:41문자 단위는 철자 오류와 대소문자 오류에 강합니다. 그러나 계산이 훨씬 느려지고 시퀀스가 매우 길어져 추론 시간도 많이 늘어납니다. 여기까지 괜찮나요? 텍스트를 다루는 가장 기본적인 내용이므로 전체적으로 이해되는지 확인하고 싶습니다. 이제 입력 텍스트를 토큰으로 잘랐습니다. 모델이 그 토큰들을 이해하게 하려면 각각의 표현을 찾아야 합니다. 이를 단어 표현이라고 부르기도 하지만, 더 정확히는 토큰 표현이라고 해야 합니다. 각 토큰을 어떻게 나타낼지 살펴보겠습니다.
⏱ 30:52가장 단순한 방법은 각 단어나 토큰에 원핫 벡터를 배정하는 것입니다. 어휘가 ‘book’, ‘soft’, ‘teddy bear’라는 세 토큰으로 이루어져 있다고 합시다. ‘soft’를 (1, 0, 0), ‘teddy bear’를 (0, 1, 0), ‘book’을 (0, 0, 1)로 나타낼 수 있습니다. 이를 원핫 인코딩(One-Hot Encoding, OHE)이라고 합니다. 토큰을 표현하는 한 방법이기는 하지만, 사람들은 토큰들을 비교하여 어떤 토큰들이 서로 더 비슷한지도 알고 싶어 합니다.
⏱ 31:509. 코사인 유사도와 원핫 표현의 한계

⏱ 31:50흔히 사용하는 유사도 척도는 코사인 유사도입니다. 들어 본 적이 있을지 모르겠지만, n차원 공간에서 두 벡터가 이루는 각도를 보는 것으로 생각하면 됩니다. 같은 방향을 가리키면 비슷하고, 직교하면 서로 독립적이며, 완전히 반대 방향이면 반대되는 의미일 수 있다는 직관입니다. 그런데 토큰을 원핫으로 표현하면 모든 서로 다른 벡터가 서로 직교합니다. 이것이 문제입니다. 이상적으로는 같거나 비슷한 뜻의 토큰들이 높은 유사도를 갖고, 관련이 없거나 서로 다른 내용을 나타내는 토큰들은 더 직교하는 방향에 있기를 바랍니다.
⏱ 33:03단순한 예로 곰 인형은 부드럽습니다. 따라서 ‘teddy bear’와 ‘soft’의 유사도는 높으면 좋겠습니다. 반면 ‘teddy bear’와 ‘book’은 여기서는 관련이 없는 것으로 보고 유사도가 0에 가까우면 좋겠습니다. 이것이 원핫 인코딩으로 얻는 결과와 우리가 원하는 결과의 차이입니다. 질문을 다시 확인하겠습니다. “왜 노름을 고려하나요?” 코사인 유사도는 실제로 노름으로 정규화합니다. 내적을 계산하는 것이지요. 아, 슬라이드에 제가 내적을 적은 부분을 말씀하시는군요. 결국 “왜 노름을 중요하게 보지 않나요?”라는 질문입니다. 이제 영상 시청자도 질문을 이해했을 것입니다.
⏱ 34:08이런 척도들은 모두 유사성을 포착하려는 방법들입니다. 왜 노름을 보지 않느냐고 묻는다면, 사람들이 그렇게 수량화해 왔다고 답할 수 있겠습니다. 실제로는 벡터가 어떻게 학습되었는지, 노름이 어떤 정보를 담는지 살펴보아야 합니다. 제가 드릴 수 있는 최선의 답은 이것도 하나의 척도이며 완벽한 척도는 아니라는 것입니다. 내적을 유사도 척도로 쓰는 경우도 있습니다. 아주 명쾌한 답을 드리기는 어렵지만, 보통은 벡터가 어느 방향을 향하는지, 서로 이루는 각도가 어떤지를 중요하게 보며 노름 자체는 크게 고려하지 않습니다. 다른 질문이 있나요?
⏱ 35:4010. 어휘 크기와 Word2vec 학습

⏱ 35:40질문은 어휘 크기가 단어·서브워드 토큰화의 선택에 어떤 영향을 주는지, 또 언어가 달라지면 어떻게 되는지입니다. 우선 어떤 과제를 하려는지에 따라 달라집니다. 한 언어만 다루는 과제라면 그 언어를 대상으로 하겠지요. 대개는 앞서 설명한 이유로 서브워드 토큰화를 택합니다. 공통 어근을 활용하면서도 OOV 위험을 줄이는 좋은 절충이기 때문입니다. 어휘 크기는 여러 시도가 있었는데, 영어라면 보통 수만 개 정도를 목표로 합니다. 요즘 모델은 다국어를 다루고 코드도 처리하므로 어휘 크기가 수십만 개 정도인 경우도 있습니다.
⏱ 36:52중국어에 관해서는 사용하는 문자 체계가 다르다는 점을 고려해야 합니다. 라틴 문자권에서는 우리에게 익숙한 알파벳을 사용하지만, 다른 언어는 그 언어의 문자에 맞는 비슷한 처리가 필요합니다. 대략적인 규모를 말하면 한 언어는 수만 개, 다국어는 수십만 개입니다. 이것이 생각해 볼 만한 어휘 크기의 자릿수입니다. 다음 질문은 “그 임베딩은 어떻게 얻나요?”입니다. 바로 다음 슬라이드 내용이므로 지금 설명하겠습니다. 원핫 인코딩이 토큰을 표현하는 좋은 방법이 아니라는 것을 알았으니, 이제 데이터에서 임베딩을 학습하려고 합니다.
⏱ 38:06앞서 2010년대에 나온 Word2vec 논문을 언급했는데, 제 기억으로는 2013년입니다. 이 연구가 인기를 끈 이유는 임베딩을 직관적이고 해석 가능한 방식으로 보여 주었기 때문입니다. 왕과 여왕의 관계를 다른 단어 관계에 대응시키거나, 파리와 프랑스의 관계가 베를린과 독일의 관계와 같다는 식입니다. 임베딩에 의미를 부여해 이해할 수 있었습니다. 그렇다면 어떻게 이런 임베딩을 얻었을까요? 두 가지 방법이 있었는데, 연속 단어 가방(Continuous Bag of Words, CBOW)과 스킵그램(skip-gram)입니다. 둘은 모두 텍스트를 활용해 문맥을 바탕으로 텍스트의 일부를 예측한다는 같은 발상에 기초합니다.
⏱ 39:10CBOW에서는 특정 목표 단어의 주변 단어들을 고려하여 그 목표 단어를 예측합니다. 스킵그램은 반대입니다. 목표 단어에서 출발해 그 주위에 있는 단어들을 예측합니다. 이런 과제를 흔히 대리 과제(proxy task)라고 부릅니다. 이 단계에서 진짜 관심사는 다음 단어를 맞히는 것 자체가 아니기 때문입니다. 적어도 아직은 그렇습니다. 목표는 단어들의 의미 있는 표현을 학습하는 것입니다. 예를 들어 모델이 다음 단어를 예측할 줄 안다면, 그것은 언어가 작동하는 방식에 대한 어떤 이해를 갖고 있다는 뜻입니다. 바로 그것을 활용하려는 것입니다.
⏱ 40:1311. 대리 과제로 임베딩을 학습하는 과정

⏱ 40:13그것이 바로 우리가 원하는 것입니다. 언어의 특성을 반영하고, 왕과 여왕의 관계나 파리가 프랑스의 수도라는 관계가 표현 안에 담긴 임베딩을 원합니다. 아주 간단한 예를 보겠습니다. 여기서는 대리 과제를 ‘다음 단어 예측’이라고 합시다. 아주 기본적인 신경망을 사용합니다. 크기가 V인 입력 벡터에 행렬을 곱하고 편향을 더해 은닉 상태를 만든 뒤, 또 다른 행렬 곱을 거쳐 최종 벡터를 얻습니다. 입력 크기는 V이고 은닉층 크기는 d입니다. d는 보통 어휘 크기보다 훨씬 작습니다. 어휘는 수만~수십만 개이지만 d는 수백 차원 정도이고, 예를 들어 768차원이 쓰입니다. 이런 대리 과제를 통해 단어 표현을 학습하려는 것입니다.
⏱ 41:59단어를 입력받아 다음 단어를 예측하겠습니다. 여기서는 ‘단어’와 ‘토큰’을 서로 바꿔 쓰고 있습니다. 첫 단어가 ‘a’이고 다음 단어 ‘cute’를 예측하려 한다고 합시다. ‘a’를 원핫 인코딩하여 신경망에 넣습니다. 행렬과 벡터를 곱하면 크기 d인 은닉 상태 벡터가 만들어집니다. 이 예에서는 d=2이고 은닉 벡터가 (0.2, 0.9)라고 합시다. 이를 다시 변환하고 소프트맥스를 거치면 다음 단어에 대한 확률들이 나옵니다. 이 장난감 예제의 어휘 크기는 6입니다. 첫 단어의 예측 확률은 0.2, 두 번째는 0.4이고, 나머지 네 단어는 각각 0.1입니다.
⏱ 43:36우리는 두 번째 어휘 항목인 정답 단어의 확률을 최대화하고 싶습니다. 따라서 예측을 두 번째 단어의 원핫 표현인 (0, 1, 0, 0, 0, 0)과 비교합니다. 그 뒤 역전파로 가중치를 갱신합니다. 이 과정에 익숙하다고 생각하지만, 핵심은 예측을 얻은 뒤 보통 교차 엔트로피 손실을 계산하여 정답과 얼마나 다른지 알아보고, 그 차이를 바탕으로 가중치를 조정해 예측을 정답에 가깝게 만드는 것입니다. 이 과정을 반복합니다. 이제 어휘의 두 번째 단어인 ‘cute’를 입력하면 원핫 표현은 (0, 1, 0, 0, 0, 0)입니다. 신경망을 통과한 은닉 상태가 (0.8, 0.4)라고 합시다. 다음 토큰인 ‘teddy bear’를 예측하려 합니다. 지금 모델이 모든 단어에 균등한 확률을 준다면 ‘teddy bear’의 확률이 커지도록 다시 학습합니다.
⏱ 45:19모든 단어에 대해 이를 거듭하면 대리 과제인 다음 단어 예측을 학습한 모델을 얻습니다. 여기서 가져올 것은 그림의 초록색 부분, 즉 모델이 학습한 표현입니다. 이후 어떤 단어가 주어지면 그 단어를 원핫 인코딩하고 이 가중치와 곱해 초록색 표현을 얻습니다. 그것이 단어의 임베딩입니다. 이해되나요? 질문은 V가 무엇이고 왜 6밖에 안 되는지입니다. 이 예에서는 가능한 단어가 여섯 개이고, 이것이 어휘 크기입니다. 단순히 설명을 위한 작은 예일 뿐 실제로는 훨씬 많습니다. 언어에는 단어의 변형이 아주 많아서 단어 단위로 토큰을 나누면 그 모든 형태를 포함해야 하므로 어휘가 매우 커질 수 있습니다.
⏱ 47:1712. 미등록 단어와 학습·생성의 종료

⏱ 47:17어휘가 학습 중 본 여섯 단어로 이루어져 있는데 추론 시 처음 보는 단어가 나오면 어떻게 될까요? 보통 ‘알 수 없는 토큰’ 또는 ‘어휘 밖 토큰’용 자리를 하나 남겨 둡니다. 식별하지 못한 모든 항목을 넣는 바구니라고 생각하면 됩니다. 식별할 수 없는 토큰들은 모두 같은 ‘알 수 없음’ 토큰 표현을 갖게 됩니다. 단어 단위 토큰화에서는 이런 OOV가 생길 가능성이 훨씬 높아 문제가 됩니다. 서브워드는 그 가능성이 낮고, 문자 단위라면 이 문제를 피할 수 있습니다. 질문에 답이 되었나요?
⏱ 48:54다음 질문의 첫 부분은 “학습을 언제 끝내나요?”입니다. 대리 과제를 학습할 때 진짜 목표는 다음 단어 예측 자체가 아니라 의미 있는 표현을 얻는 것입니다. 그래도 대리 과제의 손실 함수를 추적할 수 있습니다. 다만 그것이 최종 목표와 반드시 같지는 않다는 점을 고려해야 합니다. 합리적인 방법 하나는 모델이 수렴할 때까지 기다리는 것입니다. 여기서 에포크(epoch)는 모델이 학습 데이터셋을 몇 번 보았는지를 나타냅니다. 에포크에 따른 손실 곡선들을 비교하고 수렴하면 학습을 멈춘 뒤 결과가 타당한지 살펴봅니다. 물론 최종적으로 사용할 다운스트림 과제에 따라 달라집니다.
⏱ 49:59두 번째 질문을 다시 말해 주시겠어요? 아, “생성이 언제 멈추는지 어떻게 아나요?”라는 질문이군요. 그렇지 않으면 끝없이 생성할 수도 있겠습니다. 이를 위해 특별한 토큰을 둡니다. 대표적으로 시퀀스 종료(end-of-sequence) 토큰이 있으며, 일반적으로 이 토큰이 생성되면 멈춥니다. 이어서 은닉층의 크기는 무엇을 기준으로 정하는지에 관한 질문입니다. 이것은 절충의 문제입니다. 임베딩은 다운스트림 과제에 도움이 될 만큼 충분히 풍부해야 합니다. 예를 들어 문장 임베딩을 만들어 매우 전문적이고 가능한 결과도 많은 과제에 쓰려면 그 정보를 담는 큰 벡터가 필요할 수 있습니다. 반대로 단순한 과제라면 작은 벡터가 적절할 수 있습니다.
⏱ 51:2213. 임베딩 차원과 문맥 표현의 한계

⏱ 51:22은닉 차원의 크기는 그 뒤에 수행하는 작업의 복잡도에도 영향을 줍니다. 벡터가 길면 계산량이 많아져 추론 비용 등이 커질 수 있습니다. 따라서 고려할 요인이 많습니다. 정리하면 다운스트림 과제가 얼마나 복잡한지, 지연 시간과 비용 등에 얼마나 민감한지가 중요하며, 이들 사이에서 절충해야 합니다. 실제로는 수백~수천 차원의 임베딩을 흔히 봅니다. 모델이 점점 커지고 있으므로 수치는 바뀔 수 있지만, 대략 그 정도 규모를 생각하면 됩니다. 맞습니다. 이런 선택은 경험적입니다. 다른 사람들이 알아낸 결과에서 출발할 수도 있고, 768 같은 값은 사람들이 흔히 사용하는 수치입니다.
⏱ 52:47다음 질문은 “철자는 같지만 문맥이 다른 단어를 어떻게 구별하나요?”입니다. 제 설명보다 앞서 나가셨네요. 지금은 기본을 보고 있고, 잠시 후에는 문장 속 단어를 문맥에 맞게 표현하여 그런 문제를 해결하는 방법을 다루겠습니다. 시간이 조금 밀려 있으므로 계속하겠습니다. 지금까지는 토큰의 표현을 학습하는 방법을 봤습니다. 그러나 문장이나 더 긴 텍스트의 표현을 얻고 싶을 수도 있습니다. 앞서 배운 것만으로 할 수 있는 아주 단순한 방법은 단어 표현들의 평균을 내는 것입니다.
⏱ 53:53하지만 평균을 내면 의미의 상당 부분과 순서를 잃습니다. 그리고 방금 잘 지적했듯, 지금까지 학습한 표현은 토큰 고유의 표현이라서 그 토큰이 어디에 나오든 같습니다. 그래서 텍스트가 순서대로 나타난다는 성질을 포착하려는 모델 계열이 필요합니다. 이제 순환 신경망, Recurrent Neural Network, 줄여서 RNN을 보겠습니다. RNN은 각 단어를 따로 처리하는 대신, 토큰을 하나씩 보면서 지금까지의 문장에 대한 은닉 표현을 유지합니다. 이 기법은 앞서 말했듯 상당히 오래전인 1980년대에 도입되었으며, 단어나 토큰이 나타나는 순서를 고려합니다.
⏱ 55:0514. 순환 신경망이 문장을 처리하는 방식

⏱ 55:05문장 맨 앞에서 처리를 시작한다고 합시다. 처음에는 임시 초기 은닉 상태를 둡니다. 보통 a 또는 h로 표기하며 은닉 상태, 활성값, 때로는 문맥 벡터라고도 부릅니다. 어떤 모듈이 지금까지의 은닉 상태와 현재 시점 t의 단어를 함께 받습니다. 여기서는 첫 시점 t=1입니다. 즉 지금까지 문장의 의미를 담은 상태와 지금 등장한 단어를 고려하여 출력 벡터를 만듭니다. 이 출력은 다음 단어 예측에 사용할 수 있습니다. 그림의 파란 상자 안에서는 은닉 상태와 단어 표현에 몇 가지 행렬 곱을 적용하고, 출력 벡터가 다음 단어를 예측하도록 학습합니다.
⏱ 56:20그리고 은닉 상태를 계속 전달하며 같은 과정을 반복합니다. 각 은닉 상태는 지금까지 처리한 시퀀스의 표현이라고 해석할 수 있습니다. RNN의 장점은 이제 단어 순서가 중요해지고, 문장도 더 자연스러운 방식으로 인코딩할 수 있다는 것입니다. 늘 쓰던 “A cute teddy bear is reading” 예를 보겠습니다. 토큰 ‘a’를 원핫 벡터로 만들어 신경망에 넣고 은닉 상태를 계산한 뒤 ‘cute’를 예측합니다. 그 은닉 상태를 보관하여 다음 모듈에 넣고, 다음 단어도 함께 입력합니다. 단어 자체뿐 아니라 지금까지 문장의 은닉 상태까지 고려하여 다음 단어를 예측하고, 이를 계속 반복합니다. 이것이 RNN입니다.
⏱ 57:54RNN은 여러 과제에 사용되었습니다. 앞서 나눈 범주에 대응시켜 보겠습니다. 분류에서는 문장의 마지막 단어까지 처리한 은닉 상태를 사용할 수 있습니다. 예를 들어 리뷰의 감정이 긍정인지 부정인지 예측하려면 마지막 벡터를 원하는 레이블 공간으로 투영합니다. 여러 항목을 분류하는 과제에서는 관심 있는 토큰의 표현을 가져와 투영하면 됩니다. 생성에서는 출발 텍스트 전체를 처리하여 마지막 문맥 벡터, 즉 활성 벡터 또는 은닉 상태를 얻고, 이를 사용해 출력 예측을 디코딩합니다. 각 과제에 RNN을 사용하는 방식은 이렇습니다.
⏱ 59:1415. 장거리 의존성과 LSTM

⏱ 59:14요즘 RNN 이야기를 자주 듣지 못하는 이유는 장점도 있었지만 단점이 많았기 때문입니다. 그중 하나는 문장의 의미가 전적으로 이 은닉 상태 안에 담겨야 한다는 점입니다. 그래서 장거리 의존성 문제가 생깁니다. 모델이 과거에 본 것을 ‘기억’하는 능력이 제한되는 것입니다. 이를 개선하기 위해 RNN을 확장한 모델 계열이 나왔습니다. LSTM, Long Short-Term Memory, 즉 장단기 메모리입니다. 목표는 앞서 설명한 은닉 상태 외에, ‘기억해 둘 중요한 것’을 별도로 추적할 방법을 두는 것입니다.
⏱ 1:00:20그림의 a^(t)는 지금까지의 시퀀스를 인코딩한 활성값입니다. 여기에 또 하나 추적하는 양이 셀 상태(cell state)이며 c로 표시합니다. 이 아키텍처는 기억에 관한 부분을 개선하려는 것이지만 완벽하지는 않았습니다. RNN 기반 방법의 주요 문제는 과거의 내용을 잊는다는 것이었습니다. 문헌에서는 이 현상과 관련해 기울기 소실(vanishing gradient)이라는 용어를 보게 될 것입니다.
⏱ 1:01:08시간이 부족하지만 왜 그렇게 부르는지 설명하겠습니다. 예를 들어 마지막 단어를 예측하려면 그전에 나온 모든 은닉 상태에 의존하게 됩니다. 여기까지 괜찮나요? 이 예측을 실제 정답과 맞추도록 모델 가중치를 갱신할 때 역전파를 수행합니다. 이때 앞선 상태들에 대한 의존성도 고려해야 합니다.
⏱ 1:01:4616. 기울기 소실과 순차 계산의 병목

⏱ 1:01:46현재 값은 지금 이 계산 하나에만 달려 있는 것이 아니라, 그전에 순차적으로 일어난 이 계산과 저 계산에도 의존합니다. 따라서 시간을 거슬러 역전파하는 과정, 즉 시간 역전파가 필요합니다. 실제로 식을 써 보면 아주 복잡하지만, 결국 여러 양을 계속 곱하는 형태가 됩니다. 그 곱해지는 값들이 1보다 크면 폭발하고, 1보다 작으면 소실할 수 있습니다. 1보다 작은 값을 여러 번 곱하면 0에 가까워지기 때문입니다. 갱신에 필요한 값이 0으로 가 버리면 가중치를 제대로 갱신하기 어렵습니다. 이것이 큰 수준에서의 직관입니다. 이 강의의 중심 주제는 아니므로 복잡한 수식까지 들어가지는 않겠지만, 순차적 구조 때문에 과거를 기억하는 데 어려움이 있다는 점은 이해했으면 합니다.
⏱ 1:03:16다음 내용으로 넘어가기 전에 지금까지를 정리하겠습니다. 목표는 텍스트의 표현을 얻는 것입니다. 먼저 Word2vec으로 단어나 토큰을 표현했고, 대리 과제를 활용하여 그 표현을 학습할 수 있음을 봤습니다. 하지만 여러 한계가 있었습니다. 여러분이 지적했듯 문맥을 고려하지 못하고 단어 순서도 반영하지 못합니다. 다른 모델 계열은 단어의 순서를 고려할 수 있지만, 시퀀스가 아주 길어지면 앞선 내용을 추적하기 어렵습니다. 기울기 소실이나 장거리 의존성이라는 말은 이런 문제와 관련됩니다.
⏱ 1:04:16아직 언급하지 않은 또 다른 문제는 계산이 매우 느리다는 것입니다. 이런 모델을 학습할 때 특정 단어를 예측하려면 그보다 앞선 은닉 상태들을 전부 먼저 계산해야 합니다. 따라서 시퀀스가 길어지면 시간이 아주 오래 걸립니다. 이 여러 이유 가운데 특히 과거를 잘 기억하지 못하는 문제를 해결하려고, 사람들은 현재의 어떤 것과 과거의 어떤 것 사이에 더 직접적인 연결을 만들려고 했습니다. 이것이 어텐션(attention)의 발상입니다.
⏱ 1:05:1417. 어텐션에서 자기 어텐션으로

⏱ 1:05:14어텐션은 예측하려는 것과 과거의 정보 사이에 직접적인 연결을 두려는 방법입니다. 영어 문장을 프랑스어로 번역한다고 합시다. 기존 RNN은 “A cute teddy bear is reading”이라는 입력을 한 단어씩 처리하며 은닉 상태를 계산하고, 마지막 은닉 상태로부터 번역을 디코딩합니다. 다음 번역 단어를 생성할 때 입력 텍스트의 특정 부분을 들여다볼 수 있다면 좋겠지요. 예측할 대상과 앞선 정보 사이에 바로 연결을 두자는 것이 어텐션의 핵심입니다. 이 방식은 2014년에 도입되었고, 장거리 의존성 문제를 해결하려는 것이었습니다.
⏱ 1:06:45이 개념은 이 강의의 핵심이 됩니다. 어텐션 메커니즘이 앞으로 다룰 대부분의 내용을 작동하게 하는 원리이며, 트랜스포머 논문의 주요 원리이기 때문입니다. 수업의 중심 아키텍처인 트랜스포머는 2017년 논문 「Attention Is All You Need」에서 도입되었습니다. 제목부터 저자들이 어텐션에 의존하려 했다는 것을 알 수 있습니다. 저자들은 텍스트를 순차적으로 처리하는 방식에서 벗어나, 모델이 텍스트의 모든 부분에 한꺼번에 직접 연결되게 하려 했습니다. 이를 자기 어텐션(self-attention)이라고 합니다. 번역 과제에 적용해 보니 매우 좋은 결과가 나왔습니다.
⏱ 1:08:00같은 예로 돌아가서 ‘teddy bear’ 토큰의 표현을 계산하려면 시퀀스의 다른 모든 토큰을 한꺼번에, 직접 연결을 통해 살펴봅니다. 앞서 질문에 답하자면, 이제 ‘teddy bear’는 자신이 놓인 문맥에 고유한 표현을 갖게 됩니다. 강둑을 뜻하는 riverbank의 ‘bank’와 은행을 턴다는 표현 속 ‘bank’도 서로 다른 표현을 얻습니다. 대략적인 발상이 이해되나요? 이것이 자기 어텐션 메커니즘입니다. 여기서 시간을 확인하겠습니다. “아프신, 시간은 어떤가요?” “8분입니다.” “8분 남았나요? 좋습니다.” 이제 다른 개념 몇 가지, 주로 용어이지만 매우 중요한 것들을 소개하겠습니다.
⏱ 1:09:1718. 쿼리·키·값으로 이해하는 어텐션

⏱ 1:09:17어떤 대상을 다른 대상들로 표현할 때 쿼리(query), 키(key), 값(value), 줄여서 Q, K, V라는 용어를 씁니다. 이 예의 목표는 쿼리인 ‘teddy bear’가 어떤 다른 토큰들과 더 유사한지 알아내는 것입니다. 쿼리 하나가 있고 다른 토큰들은 키와 값으로 이루어져 있다고 생각합시다. 쿼리를 각 키와 비교하여 얼마나 유사한지 수량화하고, 그에 대응하는 값을 가져옵니다. ‘teddy bear’를 다른 모든 것으로 표현하고 싶다면 이 쿼리를 모든 키와 비교해 어떤 원소가 더 비슷한지 알아본 뒤, 더 유사한 것들에 더 큰 가중치를 주어 관련 값을 취합니다. 이것이 큰 수준에서의 설명이며 정확한 계산은 곧 살펴보겠습니다.
⏱ 1:10:56이처럼 쿼리·키·값으로 표현하면 시퀀스 전체에 대한 자기 어텐션 계산을 행렬 형태로 쓸 수 있다는 장점이 있습니다. GPU는 행렬 계산을 잘하므로 우리가 가진 하드웨어에 매우 잘 맞습니다. 앞선 설명은 쿼리와 키의 비교 결과에 소프트맥스를 적용하여 어떤 값이 더 중요한지 나타내는 가중치를 만드는 식으로 표현할 수 있습니다. 더 중요한 값에는 큰 가중치, 덜 중요한 값에는 작은 가중치를 주고, 그것을 값에 곱합니다. 아직 설명이 추상적이고 모호하게 느껴져도 괜찮습니다. 뒤에서 자세한 예를 단계별로 보겠습니다.
⏱ 1:12:41“값은 무엇이고 키는 무엇인가요? 어떻게 얻으며 무슨 뜻인가요?”라는 질문입니다. 먼저 이 양들은 학습됩니다. 사람이 고정해 놓는 값이 아닙니다. 해석하자면 키는 어떤 항목이 쿼리와 가장 비슷한지 알아내기 위한 것이고, 값은 그 항목에 실제로 연결된 내용입니다. 모든 값의 가중평균으로 어떤 대상을 표현한다면, 가중치는 기본적으로 쿼리와 키 사이의 내적으로 정하고, 값은 실제로 사용하는 벡터입니다. 다시 강조하지만 이들은 학습됩니다. 아직 설명하지 않았는데 질문에서 잘 짚었듯이, 투영을 통해 이 양들을 얻고 그 투영도 모델이 학습합니다. 괜찮나요? 이제 아키텍처를 설명할 시간이 15분 남았군요.
⏱ 1:14:0119. 인코더와 디코더의 역할

⏱ 1:14:01자기 어텐션을 구현하기 위해 저자들은 왼쪽의 인코더와 오른쪽의 디코더, 두 부분으로 구성된 아키텍처를 제안했습니다. 적용 과제는 번역입니다. 인코더에는 출발 언어의 입력 텍스트가 들어가고, 디코더에는 예측하려는 목표 언어가 들어갑니다. 큰 발상은 입력을 인코더에 통과시켜 의미 있는 임베딩을 계산하는 것입니다. 자기 어텐션을 통해 각 토큰의 표현을 다른 토큰들의 함수로 계산하려고 합니다. 이를 담당하는 것이 어텐션 층, 더 정확히는 다중 헤드 어텐션(multi-head attention) 층입니다. 다중 헤드는 이 계산을 여러 방식으로 하여 서로 다른 표현이나 투영을 학습하게 하는 것입니다.
⏱ 1:15:25입력 텍스트의 모든 토큰은 서로에게 어텐션을 적용합니다. 예를 들어 “A cute teddy bear is reading” 속 모든 토큰의 표현을 인코더의 다중 헤드 어텐션으로 계산합니다. 그다음에는 피드포워드 층이 있어서 모델이 또 다른 종류의 투영을 학습할 수 있게 합니다. 인코딩 과정이 끝나면 입력 문장의 각 토큰에 대한 풍부한 표현을 얻습니다. 여기까지 괜찮나요? 이제 실제 목표인 번역을 해야 합니다. 문장 시작 토큰을 첫 토큰으로 넣어 번역을 시작하고, 입력 문장의 모든 표현을 사용하여 다음에 무엇을 예측할지 결정합니다.
⏱ 1:16:50방금 설명한 것은 디코더에서 두 번째로 나오는 교차 어텐션(cross-attention) 층입니다. 그림의 화살표가 보일지 모르겠는데, 인코더에서 두 개, 디코더에서 한 개의 화살표가 들어옵니다. 디코더에서 오는 것은 쿼리, 키, 값 중 무엇일까요? 셋 중 하나이니 맞힐 확률은 약 33%입니다. 누가 답해 볼까요? “키인가요?” “쿼리요?” 이렇게 생각해 보세요. 지금 알고 싶은 것은 입력 단어들 중 무엇이 중요하냐는 것입니다. 쿼리가 주어졌을 때 입력의 어떤 항목이 중요한지 묻는 것이므로, 디코더에서 오는 화살표는 쿼리가 맞습니다. 키와 값은 입력 시퀀스에서 나온 인코더 표현으로부터 옵니다.
⏱ 1:18:1420. 마스크 자기 어텐션과 위치 정보

⏱ 1:18:14또 다른 어텐션 층은 지금 디코딩 중인 출력 문장의 어떤 토큰이 다음 토큰 예측에 유용한지 알아내려 합니다. 프랑스어 번역을 시작하여 “un ours en peluche”까지 생성했다고 합시다. 다음 단어를 예측할 때 지금까지 번역한 토큰 중 무엇이 도움이 되는지 알아야 합니다. 이 층이 바로 그 일을 합니다. ‘마스크’라고 부르는 이유는 지금까지 번역한 토큰만 보기 때문입니다. 아직 번역하지 않은 토큰은 존재하지 않으므로 볼 수 없습니다. 즉 예측하려는 토큰의 오른쪽에 있는 미래 토큰을 볼 수 없게 합니다.
⏱ 1:19:17큰 그림에서 어텐션 층은 인코더에도 디코더에도 있지만 용도가 다릅니다. 인코더의 어텐션은 입력 문장 토큰들의 임베딩을 그 입력 토큰들 서로의 함수로 계산합니다. 디코더의 첫 번째, 마스크 자기 어텐션은 지금까지 디코딩한 모든 것을 바탕으로 표현을 만듭니다. 두 번째인 교차 어텐션은 입력에서 본 내용을 바탕으로 표현을 만듭니다. 여기서는 서로 다른 토큰 사이에 직접 연결이 있으므로 순서 감각이 저절로 생기지 않습니다. RNN에서는 하나씩 처리하여 단어 순서를 알 수 있었지만, 직접 연결만으로는 그렇지 않습니다. 그래서 시퀀스 속 단어의 위치를 알려 주는 위치 인코딩(positional encoding)을 넣습니다. 오늘 깊이 다루지는 않지만 이 부분이 있다는 것을 짚고 싶습니다.
⏱ 1:20:46전체 흐름을 다시 보겠습니다. 출발 언어의 문장을 목표 언어로 번역하려면 먼저 텍스트를 토큰화하여 단위로 나누고, 각 토큰의 임베딩을 학습합니다. 이것이 입력 임베딩 부분입니다. 그런 다음 위치에 관한 인코딩을 더합니다. 오늘 자세히 설명하지 않지만 기억해 두면 좋습니다. 인코더는 다중 헤드 어텐션 층에서 입력의 다른 항목들로 각 항목을 표현하고, 이어 피드포워드 신경망을 통과시켜 벡터를 투영합니다. 이는 학습할 자유도를 더 주는 것입니다.
⏱ 1:21:48입력 표현을 얻었으면 BOS, 즉 문장 시작 토큰으로 번역을 시작합니다. 다음 단어가 무엇인지 알아내기 위해 먼저 지금까지 번역한 단어 가운데 유용한 것들을 봅니다. 이것이 마스크 다중 헤드 어텐션 층의 역할입니다. 이어 교차 어텐션 층에서는 입력에 있던 내용을 바탕으로 표현합니다. 그다음 피드포워드 신경망으로 다시 자유도를 더합니다. 마지막으로 벡터를 얻고 소프트맥스를 거칩니다. 이것은 다음 단어를 선택할 수 있게 해 주는 과정입니다.
⏱ 1:22:5121. 다중 헤드 어텐션의 의미

⏱ 1:22:51이렇게 얻은 벡터의 값들로 다음 단어가 무엇일지 결정합니다. 쉽지요? 질문이 있나요? “헤드가 무엇을 뜻하나요?”라는 좋은 질문입니다. 제가 너무 빨리 지나갔네요. 자기 어텐션에서는 쿼리를 키와 상호작용시키고 대응하는 값을 취합니다. 이 계산을 여러 번 해도 됩니다. 여기서 헤드는 쿼리·키·값을 얻는 데 사용하는 투영 행렬들의 한 묶음을 가리킵니다. 여러 헤드를 두면 모델이 서로 다른 투영을 학습할 수 있습니다. 즉 벡터 사이의 여러 관계를 학습하도록 자유도를 더 주는 것입니다. 헤드 수는 보통 소문자 h로 표시합니다.
⏱ 1:24:23마침 이를 설명하는 슬라이드가 있습니다. 다중 헤드는 모델이 학습하는 서로 다른 투영 행렬을 사용하여 자기 어텐션 계산을 여러 번 병렬로 수행하는 것입니다. 컴퓨터 비전 배경이 있다면 합성곱에 여러 필터를 두는 것과 비슷한 발상이라고 생각할 수 있습니다. 여기서는 작동 방식이 다르지만 아이디어는 비슷합니다. “투영들이 서로 다르게 되나요?”라는 질문입니다. 보통 서로 달라야 한다는 제약을 걸지는 않고 모델이 학습하도록 둡니다. 실제로는 같은 내용을 표현하는 서로 다른 방식들을 학습하는 경향이 있습니다. 이 부분을 바꾸면 어떻게 되는지 연구한 논문들도 있지만, 일반적으로는 별도의 제약을 두지 않습니다.
⏱ 1:25:39이제 트랜스포머 저자들이 사용한 또 하나의 기법을 말씀드리겠습니다. 레이블 스무딩(label smoothing)입니다. 들어 본 분이 있나요? 자연어에서는 다음에 무엇이 올 수 있는지에 답이 여러 개인 경우가 많습니다. “What a great day”, “What a great lecture”, “What a great book”처럼 “What a great …” 뒤의 빈칸을 채우는 방법은 여럿입니다. 레이블 스무딩은 직관적으로 이 점을 반영하려는 기법입니다.
⏱ 1:26:2522. 레이블 스무딩과 관련 질의응답

⏱ 1:26:25“이 단어가 100% 정답이고 다른 단어는 절대 아니다”라고 하는 대신, “이 단어를 예측하되 다른 단어일 가능성도 있다”고 합니다. 실제로는 원핫 레이블을 바꿉니다. 예측 목표를 (1, 0, 0, 0)으로 두는 대신 정답 위치에는 1−ε, 나머지 V−1개 위치에는 각각 ε/(V−1)을 줍니다. 이렇게 하면 모델이 예측을 덜 확신하는 경향이 있습니다. 특정 답을 예측하도록 하면서도 실제로는 그것이 유일한 정답이 아닐 수 있다고 알려 주는 것입니다. 저자들은 이 방식이 번역 과제의 대리 지표인 BLEU 같은 지표를 개선하는 경향이 있음을 관찰했습니다. NLP 전반에서 알아 두면 좋은 비교적 일반적인 방법입니다.
⏱ 1:27:37이제 약 20분 정도 남았으므로 셔빈이 처음부터 끝까지 이어지는 예를 보여 드리겠습니다. 그전에 질문이 있군요. “u는 무엇인가요?” 여기서는 어떤 양이라고 생각하면 됩니다. 이 자리에서 정의되어 있지는 않습니다. δ는 원핫과 같은 것으로 생각할 수 있습니다. 상수일 수도 있습니다. 다음은 탐색과 활용(explore and exploit)의 관계에 관한 질문입니다. 흥미로운 질문이네요. 그런데 소프트맥스만으로 이것이 저절로 된다고 생각하는 이유는 무엇인가요?
⏱ 1:28:52결국 모델의 예측을 레이블과 비교합니다. 여기서 문제는 (1, 0, 0, 0)과 비교할 것인지, 그와 다른 값들과 비교할 것인지입니다. 소프트맥스 자체로는 이 레이블 변경을 할 수 없습니다. 맞습니다. 설명이 명확하지 않았을 수 있지만, 여기서 바꾸는 것은 실제로 레이블입니다. 목표가 (1, 0, 0)인 상태로 두는 대신, 모델이 덜 확신하는 예측을 하도록 레이블을 바꿉니다. 감사합니다. 그럼 셔빈에게 넘기겠습니다. “감사합니다, 아프신. 지금까지 트랜스포머가 어떻게 작동하는지 봤으니, 이제 구체적인 예 하나로 전체를 연결해 보겠습니다.”
⏱ 1:29:4723. 입력 토큰과 위치 인코딩

⏱ 1:29:47늘 쓰던 “A cute teddy bear is reading”을 다시 예로 들겠습니다. 모든 단계를 함께 보겠습니다. 우선 토큰화합니다. 앞서 말했듯 적절한 단위를 정해 문장을 토큰들로 나눕니다. 누군가 말했듯 시퀀스의 시작과 끝을 표시할 방법도 필요합니다. 보통 BOS와 EOS 토큰으로 표시하므로 이를 추가합니다. 이제 각 토큰 표현의 구성에 집중하겠습니다. 각 토큰에는 학습되는 임베딩이 있습니다. 그리고 시퀀스 속 단어, 더 정확히는 토큰의 위치를 알 수 있도록 위치 임베딩 형태의 정보를 더합니다.
⏱ 1:30:47원래 논문은 사인과 코사인을 사용하는 방식을 택했고, 이 위치 정보를 토큰 표현에 더합니다. 즉 원소별 덧셈입니다. 그러면 위치 정보를 가진 토큰 임베딩을 얻습니다. 이를 모든 토큰에 대해 반복하면 임베딩 전체를 행렬 형태로 볼 수 있습니다. 한 축의 크기는 임베딩 크기인 d_model이고, 다른 축의 크기는 시퀀스 길이로 보통 n입니다. 여기까지 괜찮나요? 입력에 관해 질문이 없으면 이 표현을 다음 단계로 보내겠습니다.
⏱ 1:31:41자기 어텐션에서는 이 입력을 세 공간에 투영합니다. W_Q로 투영하면 쿼리, 같은 임베딩을 W_K로 투영하면 키, W_V로 투영하면 값을 얻습니다. W_Q, W_K, W_V는 모델이 학습하는 투영 행렬입니다. 그러면 앞서 아프신이 설명한 자기 어텐션 공식을 적용할 수 있습니다. 식으로 쓰면 Attention(Q, K, V) = softmax(QKᵀ/√d_k)V입니다. 이 계산의 결과도 행렬입니다. 잠시 멈추고 실제 계산이 어떻게 이루어지며 각 단계가 무엇을 뜻하는지 살펴보겠습니다.
⏱ 1:32:5224. 스케일 내적 어텐션의 계산

⏱ 1:32:52Q를 계산한다는 것은 임베딩을 쿼리 공간으로 투영한다는 뜻입니다. 얻어진 행렬에서 각 행은 하나의 쿼리를 나타냅니다. Kᵀ는 키 행렬을 전치한 것으로, 각 열이 각 토큰의 키 표현입니다. 이를 행렬 곱으로 결합하면 각 행에 해당 쿼리와 모든 키 사이의 내적이 들어갑니다. 이 결과에 소프트맥스를 적용하면, 각 쿼리에 대해 키들에 걸친 확률 분포를 얻습니다. 각 행에 이런 분포 하나씩이 들어가는 것입니다.
⏱ 1:33:55왜 √d_k로 나누어 스케일을 조정하는지 질문한 분이 있었는지 모르겠습니다. 내적이 성립하려면 쿼리 차원 d_q와 키 차원 d_k가 같아야 하므로 √d_q라고 써도 됩니다. 키와 쿼리의 차원이 커지면 이 내적도 커지는 경향이 있습니다. 그래서 내적을 정규화하려고 키 차원의 제곱근으로 나눕니다. 그 뒤 소프트맥스 결과에 값 행렬 V를 곱합니다. 앞서 설명했듯 쿼리를 키들과 비교하고, 각 키에 대응하는 값과 결합하는 것입니다. 결과적으로 각 쿼리마다 값들의 가중합을 얻습니다. 여기까지 이해되나요?
⏱ 1:35:17다중 헤드는 이것을 딱 한 번만 계산하는 것이 아닙니다. h번 계산하며 전부 병렬로 수행합니다. 마지막에는 이런 행렬 h개를 얻고, 열 방향으로 이어 붙입니다. 이후 W_O라는 또 다른 투영 행렬로 원래 임베딩 차원으로 돌려놓습니다. 따라서 전체 모듈의 입력과 출력은 원래의 차원을 유지합니다. 중간에 “건강하세요”라고 인사한 뒤 계속합니다. 질문이 있나요?
⏱ 1:36:1525. 헤드의 다양성, 피드포워드 층과 층 쌓기

⏱ 1:36:15질문은 헤드 h개가 매번 같은 결과를 낼 수도 있는지, 그렇다면 같은 것을 이어 붙이는 게 도움이 되는지입니다. 정확히 이해했나요? 무엇이 헤드들을 다르게 만들까요? 경사하강법의 효과라고 할 수 있습니다. 신경망에는 최종 목적 함수와 여러 자유도가 있습니다. 다음 단어를 학습하는 데 유용한 표현을 만들 동기가 있으며, 같은 내용을 그대로 복제할 이유는 없습니다. 실제로는 서로 다른 표현을 만들어 연결한 뒤 유용한 것으로 투영하는 쪽으로 수렴하는 모습을 봅니다. 같아지지 않도록 강제하는 것은 무엇인가요? 그런 제약은 없습니다. 다만 모델에 허용한 학습의 성격상 실제로는 그렇게 된다는 것입니다. 좋은 질문입니다. 경사하강법은 흔히 놀라운 일을 합니다.
⏱ 1:37:27자기 어텐션 층 다음에는 FFN, 즉 피드포워드 신경망이라는 구성 요소가 있습니다. 아까 입력·출력에 비해 은닉층의 차원을 어떻게 정하는지 질문이 있었지요. Word2vec에서는 보통 은닉 차원이 입력·출력보다 작았습니다. 하지만 여기서는 은닉층 차원이 입력·출력보다 큽니다. 유용한 표현을 학습할 충분한 자유도를 주기 위해서입니다. 학습하는 특징들을 더 복잡하게 만들 수 있게 하는 방법입니다. 이어지는 짧은 발언은 [청취 불명]입니다.
⏱ 1:38:11인코더 모듈은 하나만 있는 것이 아닙니다. 원 논문에서 대문자 N으로 표시한 개수만큼 있습니다. 이 모든 과정을 지나면 문맥을 고려하여 인코딩된 임베딩 집합을 얻습니다. 이 임베딩들을 N개의 디코더에 전달합니다. 즉 인코더 N개를 차례로 쌓고, 디코더도 N개를 차례로 쌓습니다. 마지막 인코더의 표현이 각 디코더의 교차 어텐션에 들어갑니다. 이 부분도 더 자세히 보겠습니다. 그러면 디코딩은 맨 처음 어떻게 시작할까요? 모델에 “다음 단어를 예측하자, 시작하자”라고 알려 주는 것입니다.
⏱ 1:39:0126. 디코딩의 반복과 시퀀스 종료

⏱ 1:39:01맨 처음에는 BOS 토큰을 디코더에 넣습니다. 인코더와 마찬가지로 자기 어텐션 층이 있지만, 앞서 말했듯 디코더의 자기 어텐션은 인과적(causal)입니다. 현재 토큰과 그보다 앞선 토큰에만 어텐션을 적용합니다. 첫 BOS 토큰에서는 자기 자신만 보므로 차이가 눈에 띄지 않습니다. 하지만 다른 토큰들을 디코딩할 때는 어느 위치까지 볼 수 있는지에 차이가 생깁니다. 자기 어텐션 층을 거친 다음 교차 어텐션으로 넘어갑니다. 여기서는 앞서 인코딩한 임베딩들을 키와 값으로 받고, 자기 어텐션 층에서 나온 표현을 쿼리로 사용합니다.
⏱ 1:40:13교차 어텐션 뒤에는 인코더에서처럼 FFN이 있어서 표현을 더 풍부하게 만듭니다. 질문이 있나요? 없군요. 이런 처리를 N번 반복합니다. 디코딩 과정의 맨 마지막에는 선형 투영과 소프트맥스 층이 있어서 다음 단어의 예측을 전체 어휘에 걸친 확률 분포로 바꿉니다. 여기까지가 다음 단어 하나를 예측하는 과정입니다. 이후 같은 과정을 계속 반복합니다. 다음 토큰을 찾으면 그 토큰을 원핫으로 나타낼 수 있고, 그에 해당하는 임베딩을 다시 디코더에 넣어 과정을 이어 갑니다.
⏱ 1:41:10언제 멈출까요? 여러분에게 묻겠습니다. “EOS 토큰에 도달했을 때요.” 맞습니다. 이 과정이 바로 획기적인 원래 논문의 저자들이 기계 번역을 수행한 방식입니다. 번역이 그 논문에서 제시한 대표적인 사용 사례였습니다. 그럼 집중해서 들어 주셔서 감사합니다. [박수]






