글

8월, 2026의 게시물 표시

내적이란? AI가 두 벡터의 관계를 하나의 숫자로 계산하는 원리

이미지
지난 글에서는 행렬이 입력 벡터를 새로운 출력 벡터로 바꾸는 변환 규칙이라는 점을 살펴봤습니다. 그런데 행렬의 한 행과 입력 벡터가 만나 출력 숫자 하나를 만드는 순간에는 정확히 어떤 계산이 일어날까요? 그 핵심이 내적(Dot Product) 입니다. 내적은 두 벡터의 같은 위치에 있는 성분끼리 곱하고, 그 결과를 모두 더해 하나의 숫자로 만드는 연산입니다. 계산법은 단순하지만 행렬곱, 신경망의 가중합, Attention 점수, 임베딩 검색으로 이어지는 중요한 연결점입니다. 이번 글에서는 공식만 외우지 않고, 내적의 결과가 왜 두 벡터의 방향과 관계를 반영하는지까지 알아보겠습니다. 내적이란? 같은 차원의 두 벡터 a = [a₁, a₂, …, aₙ]과 b = [b₁, b₂, …, bₙ]이 있을 때 내적은 다음과 같이 정의합니다. a · b = a₁b₁ + a₂b₂ + … + aₙbₙ 핵심은 두 단계입니다. 첫째, 같은 위치의 성분끼리 곱합니다. 둘째, 만들어진 곱을 모두 더합니다. 벡터 두 개를 입력으로 받지만 결과는 벡터가 아니라 숫자 하나입니다. 이런 하나의 숫자를 스칼라(Scalar) 라고 합니다. 두 벡터의 차원은 같아야 합니다. [2, 3]과 [4, −1]은 모두 2차원이므로 내적할 수 있지만, [2, 3]과 [4, −1, 5]는 성분을 일대일로 짝지을 수 없어 그대로는 계산할 수 없습니다. NumPy 공식 문서도 1차원 배열의 내적을 같은 위치의 곱을 합산하는 연산으로 설명하며, 마지막 차원의 크기가 맞지 않으면 오류가 발생한다고 명시합니다. NumPy inner 공식 문서 숫자로 직접 계산해 보기 a = [2, 3], b = [4, −1]이라고 해 보겠습니다. 첫 번째 성분끼리 곱하면 2×4 = 8이고, 두 번째 성분끼리 곱하면 3×(−1) = −3입니다. 두 결과를 더하면 8 + (−3) = 5이므로 a · b = 5입니다. 내적은 단순한 전체 합과 다릅니다. a의 첫 번째 ...

행렬이란? AI가 벡터를 변환하고 학습하는 핵심 원리

이미지
지난 글에서는 여러 숫자를 순서대로 묶은 벡터 가 하나의 대상을 표현하는 방법을 살펴봤습니다. 그렇다면 수많은 벡터를 정리하고, 입력 벡터를 새로운 벡터로 바꾸는 계산은 무엇으로 표현할까요? 이때 등장하는 도구가 바로 행렬(Matrix) 입니다. 행렬이란? 행렬은 숫자를 직사각형 모양으로 배열한 표입니다. 가로 방향을 행(Row) , 세로 방향을 열(Column) , 각 칸에 들어 있는 숫자를 원소(Element) 라고 합니다. 단순한 표처럼 보이지만 숫자의 위치와 순서가 의미를 가지므로 마음대로 자리를 바꾸면 안 됩니다. 행이 2개이고 열이 3개인 행렬의 크기는 2 × 3 이라고 씁니다. 항상 ‘행의 수 × 열의 수’ 순서입니다. 프로그래밍에서는 이런 크기를 shape 라고 자주 부릅니다. NumPy 공식 문서도 배열의 shape를 각 차원의 길이를 담은 튜플로 설명합니다. NumPy shape 문서 행렬을 보통 A라고 이름 붙이면 특정 원소는 a ij 처럼 표시할 수 있습니다. 아래쪽의 i는 몇 번째 행인지, j는 몇 번째 열인지를 뜻합니다. 예를 들어 아래 그림에서 a 23 은 두 번째 행, 세 번째 열에 있는 6입니다. 좌표를 읽듯 먼저 행을 찾고 그다음 열을 찾으면 어렵지 않습니다. 벡터와 행렬의 관계도 함께 알아두면 좋습니다. 벡터 하나를 세로로 세우면 열이 하나인 행렬처럼 볼 수 있고, 가로로 눕히면 행이 하나인 행렬처럼 볼 수 있습니다. 예를 들어 세 값 [키, 몸무게, 나이]로 사람 한 명을 표현한다면 이는 하나의 벡터입니다. 사람 100명의 벡터를 한 줄씩 쌓으면 100개의 행과 3개의 열을 가진 데이터 행렬이 됩니다. 이때 각 행은 하나의 샘플, 각 열은 하나의 특징을 뜻합니다. 다만 모든 문제에서 행과 열의 의미가 똑같지는 않습니다. 이미지에서는 세로·가로 픽셀 위치가 축이 되고, 문장 처리에서는 토큰 순서와 임베딩 성분이 축이 될 수 있습니다. 중요한 것은 행렬을 보기 전에 각 축이 무엇을 ...

벡터란? AI의 숫자 묶음에서 방향·크기·거리까지 이해하기

이미지
기초 시리즈에서는 임베딩을 “단어나 문장을 나타내는 숫자 묶음”이라고 설명했습니다. 이 표현은 시작점으로 충분하지만, AI의 계산을 더 깊이 이해하려면 숫자들이 왜 묶여 있고, 그 묶음의 방향과 길이, 서로의 거리가 무엇을 의미하는지 살펴봐야 합니다. 중급 시리즈의 첫 주제는 벡터(Vector) 입니다. 벡터는 임베딩뿐 아니라 신경망의 입력과 출력, 가중치 계산, Attention, 유사도 검색까지 이어지는 공통 언어입니다. 이번 글에서는 벡터를 단순한 숫자 목록에서 공간의 방향과 관계를 표현하는 대상으로 확장해 보겠습니다. 벡터란 무엇인가? 벡터는 순서가 있는 숫자들의 모음입니다. 예를 들어 [3, 4] 와 [4, 3] 은 같은 숫자를 포함하지만 순서가 다르므로 서로 다른 벡터입니다. 각 숫자를 벡터의 성분(Component) 이라고 부릅니다. 벡터를 이해하는 대표적인 두 관점이 있습니다. 목록 관점: 여러 특징이나 측정값을 순서대로 담은 숫자 배열입니다. 기하학 관점: 공간에서 특정 방향과 크기를 가진 화살표 또는 한 점의 위치입니다. 두 관점은 서로 다른 개념이 아닙니다. [3, 4] 는 첫 번째 축으로 3, 두 번째 축으로 4만큼 이동한다는 뜻으로 그릴 수 있습니다. 같은 숫자 묶음이 계산에서는 배열이고, 좌표 공간에서는 이동과 위치가 되는 것입니다. 스칼라와 벡터는 어떻게 다를까? 스칼라(Scalar) 는 하나의 숫자입니다. 온도 20도, 학습률 0.001처럼 크기 하나만 나타냅니다. 반면 벡터는 여러 성분을 함께 가지므로 하나의 대상을 여러 측면에서 표현할 수 있습니다. 예를 들어 학생 한 명을 [수학 점수, 영어 점수, 과학 점수] 순서로 표현하면 [80, 90, 70] 은 3차원 벡터가 됩니다. 여기서는 각 차원의 의미를 사람이 정했습니다. 임베딩에서는 각 차원의 의미가 이렇게 깔끔하게 이름 붙는 경우가 드물고, 학습 과정에서 여러 특징이 많은 차원에 분산됩니다. 벡터의 성분, 방향, 크기 벡터 v ...

프롬프트 엔지니어링이란? AI에게 원하는 답을 명확히 요청하는 방법

이미지
지난 글에서는 ChatGPT가 질문과 대화 문맥을 토큰으로 처리한 뒤, 다음 토큰을 반복해서 예측하며 답변을 만든다는 원리를 알아봤습니다. 그렇다면 같은 AI를 사용해도 어떤 사람은 원하는 결과를 빠르게 얻고, 어떤 사람은 계속 엉뚱한 답을 받는 이유는 무엇일까요? 차이는 모델의 성능뿐 아니라 무엇을 원하는지 얼마나 분명하게 전달했는가 에서 생길 수 있습니다. 프롬프트 엔지니어링은 AI에게 마법의 주문을 입력하는 기술이 아니라, 목표와 맥락, 자료, 제약 조건, 출력 형식을 설계하고 결과를 반복해서 개선하는 방법입니다. 프롬프트란 무엇일까? 프롬프트(Prompt) 는 AI 모델에 전달하는 입력입니다. 간단한 질문 한 줄일 수도 있고, 참고 문서와 작업 규칙, 결과 형식이 포함된 긴 요청문일 수도 있습니다. 대화형 AI에서는 이전 메시지와 현재 질문도 모델이 답을 만드는 문맥에 영향을 줍니다. 프롬프트 엔지니어링(Prompt Engineering) 은 원하는 결과를 얻기 위해 이 입력을 구조화하고 시험하며 개선하는 과정입니다. 한 번 잘 써서 영원히 사용하는 문장이라기보다, 실제 결과를 보고 부족한 조건을 보완하는 설계 작업에 가깝습니다. 왜 프롬프트가 결과를 바꿀까? 언어 모델은 현재 문맥을 바탕으로 이어질 토큰의 가능성을 계산합니다. “글을 써 줘”처럼 범위가 넓은 요청에는 주제, 독자, 길이, 말투, 포함할 내용이 정해져 있지 않습니다. 모델은 빈칸을 추정해서 채워야 하므로 사용자가 기대한 방향과 달라질 가능성이 커집니다. 반대로 “AI 입문자를 대상으로 임베딩을 설명하는 1,500자 글을 작성하고, 비유 한 개와 주의점 세 개를 포함해 H2 제목으로 구분해 줘”라고 요청하면 가능한 결과의 범위가 좁아집니다. 모델이 무엇을 선택해야 하는지 판단할 근거가 늘어나는 것입니다. 공식 OpenAI 모델 가이드 도 목표, 관련 맥락, 제약 조건, 필요한 근거, 성공 기준과 출력 형식을 명확히 전달하는 방식을 권장합니다. 다만 지시를 같은 뜻으로 ...

ChatGPT는 어떻게 답변할까? 질문이 답변으로 만들어지는 원리

이미지
지난 글에서는 토큰 ID가 임베딩 벡터로 바뀌고, 비슷한 맥락에서 쓰이는 표현들이 숫자 공간에서 관계를 형성하는 원리를 알아봤습니다. 그렇다면 사용자가 질문을 입력한 순간부터 화면에 답변이 나타날 때까지는 어떤 일이 일어날까요? ChatGPT의 답변은 저장된 문장 하나를 그대로 꺼내 보여주는 방식이 아닙니다. 입력된 질문과 대화 문맥을 처리한 뒤, 이어질 가능성이 있는 토큰을 예측하고 선택하는 과정을 반복해 답변을 만듭니다. 여기에 지시를 따르도록 학습된 방식, 안전 규칙, 그리고 필요할 때 사용할 수 있는 도구가 함께 작동할 수 있습니다. ChatGPT와 언어 모델은 같은 말일까? 둘은 밀접하지만 완전히 같은 개념은 아닙니다. 언어 모델 은 문맥을 바탕으로 다음 토큰의 가능성을 계산하는 핵심 모델입니다. ChatGPT 는 사용자가 이 모델과 대화할 수 있도록 입력과 출력, 대화 기록, 지시 체계, 안전 기능, 도구 연결 등을 구성한 서비스입니다. 따라서 “ChatGPT가 답변한다”는 말에는 기본적인 언어 생성뿐 아니라 사용자가 보낸 메시지를 정리하고, 현재 대화의 관련 내용을 전달하며, 결과를 화면에 보여주는 과정까지 포함됩니다. 기능과 설정에 따라 웹 검색, 파일 분석, 이미지 이해 같은 도구가 연결될 수도 있지만 모든 답변이 항상 외부 검색을 거치는 것은 아닙니다. ChatGPT 답변 생성의 전체 흐름 핵심 흐름은 다음 여섯 단계로 정리할 수 있습니다. 실제 시스템 내부에는 더 많은 처리와 검사가 존재할 수 있지만, 답변 생성 원리를 이해하기에는 이 구조가 유용합니다. 질문 입력: 사용자의 메시지와 필요한 대화 문맥이 모델 입력으로 준비됩니다. 토큰화: 텍스트를 모델이 처리할 수 있는 토큰으로 나누고 각각을 숫자 ID로 바꿉니다. 임베딩과 문맥 처리: ID를 벡터로 변환하고 Transformer가 토큰 사이의 관계를 계산합니다. 다음 토큰 예측: 현재 문맥 뒤에 올 수 있는 토큰마다 점수와 확률 분포를 만듭...

임베딩이란? AI가 단어의 의미를 숫자 벡터로 표현하는 방법

이미지
지난 글에서는 AI가 문장을 토큰(Token) 이라는 작은 조각으로 나누고, 각 토큰을 고유한 숫자 ID로 바꾼다는 것을 알아봤습니다. 하지만 “고양이”가 314번이고 “강아지”가 927번이라고 해서 AI가 두 단어의 관계를 이해할 수 있는 것은 아닙니다. 숫자 ID는 사전에서 토큰을 찾기 위한 주소일 뿐, 숫자의 크기나 간격에는 의미가 없기 때문입니다. 언어 모델이 단어 사이의 관계를 계산하려면 ID를 더 풍부한 숫자 표현으로 바꿔야 합니다. 이때 사용하는 것이 임베딩(Embedding) 입니다. 이번 글에서는 임베딩이 무엇이며 어떻게 학습되고, Transformer와 LLM에서 어떤 역할을 하는지 차근차근 살펴보겠습니다. 임베딩이란? 임베딩은 단어·토큰·문장 같은 대상을 여러 개의 실수로 이루어진 벡터(Vector) 로 표현하는 방법입니다. 예를 들어 “고양이”라는 토큰이 [0.2, -0.7, 0.4, …] 처럼 수백 개 이상의 숫자로 표현될 수 있습니다. 여기에 나온 숫자는 이해를 돕기 위한 예시이며, 실제 값과 벡터 길이는 모델마다 다릅니다. Google의 머신러닝 임베딩 학습 자료 는 임베딩을 희소한 데이터를 더 낮은 차원의 조밀한 벡터로 표현하여 항목 사이의 의미 관계를 담는 방법으로 설명합니다. 핵심은 하나의 번호 대신 여러 숫자의 조합으로 대상을 표현한다는 점입니다. 토큰 ID만으로는 왜 부족할까? 토큰 ID는 단지 어휘 사전의 항목을 구분하는 번호입니다. “고양이”의 ID가 314이고 “강아지”의 ID가 927이라고 가정해도, 927에서 314를 뺀 값은 두 동물의 의미 차이를 나타내지 않습니다. “자동차”의 ID가 315라고 해서 고양이와 자동차가 고양이와 강아지보다 비슷한 것도 아닙니다. 원-핫 인코딩처럼 한 위치만 1이고 나머지는 모두 0인 벡터를 사용할 수도 있지만, 어휘가 커질수록 벡터가 매우 길고 대부분이 0인 희소한 표현이 됩니다. 서로 다른 토큰의 원-핫 벡터만 보아서는 어떤 단어가 비슷하게 쓰이는지도 알기 어렵...

토큰이란? AI가 문장을 읽고 만드는 기본 단위

이미지
지난 글에서는 LLM이 문맥에 이어질 내용을 확률적으로 예측하고, 선택한 결과를 다시 문맥에 넣어 긴 답변을 만든다는 것을 알아봤습니다. 이때 모델이 한 번에 예측하는 기본 단위가 바로 토큰(Token) 입니다. 토큰은 AI가 글을 읽고 만드는 작은 조각입니다. 하나의 단어일 수도 있지만 단어의 일부, 문장 부호, 공백과 결합된 문자열이 될 수도 있습니다. 따라서 토큰을 단순히 ‘단어’라고만 생각하면 실제 동작을 이해하기 어렵습니다. 왜 문장을 토큰으로 나눌까? 신경망은 글자를 그대로 이해하지 않고 숫자로 계산합니다. 먼저 토크나이저(Tokenizer) 가 입력 문장을 정해진 규칙에 따라 토큰으로 나누고, 각 토큰을 어휘 사전에 등록된 숫자 ID로 바꿉니다. 예를 들어 “오늘 날씨가 좋다”라는 문장이 여러 토큰으로 분리되면 각 조각은 고유한 토큰 ID에 대응합니다. 모델은 이 ID를 입력받은 뒤 다음 글에서 살펴볼 임베딩 벡터로 변환해 계산합니다. 토큰은 단어와 어떻게 다를까? 사람은 보통 띄어쓰기 단위로 단어를 구분하지만, 토크나이저는 모델이 학습한 어휘와 분할 알고리즘을 기준으로 문장을 나눕니다. 자주 등장한 짧은 단어는 하나의 토큰이 될 수 있습니다. 긴 단어나 드문 단어는 여러 부분 단어로 나뉠 수 있습니다. 쉼표와 마침표 같은 문장 부호가 별도 토큰이 될 수 있습니다. 공백이 다음 단어와 결합된 형태로 저장될 수도 있습니다. Google의 대규모 언어 모델 입문 자료 에서는 토큰이 단어, 부분 단어 또는 한 글자일 수 있으며, 현대 언어 모델은 주로 부분 단어 단위의 토큰화를 활용한다고 설명합니다. 토큰화 과정 살펴보기 원문 입력: 사용자가 자연어 문장을 입력합니다. 정규화와 분할: 토크나이저가 규칙에 따라 글을 처리하고 여러 토큰으로 나눕니다. ID 변환: 각 토큰을 어휘 사전의 숫자 ID에 연결합니다. 모델 입력: ID가 임베딩으로 변환되어 신경망 계산에 사용됩니다. ...

LLM이란? 대규모 언어 모델이 문장을 배우고 만드는 원리

이미지
지난 글에서는 Transformer 가 Self-Attention으로 문장 안의 여러 토큰 관계를 살펴보고 문맥을 처리하는 구조라는 것을 알아봤습니다. 이 구조를 많은 데이터와 큰 규모의 신경망으로 학습하면 오늘날 자주 접하는 LLM 으로 이어집니다. LLM(Large Language Model, 대규모 언어 모델) 은 많은 텍스트에서 언어의 패턴을 학습하고, 주어진 문맥에 이어질 토큰의 가능성을 예측하는 모델입니다. 질문에 답하거나 글을 요약하고 번역할 수 있지만, 사람처럼 생각하거나 모든 사실을 정확히 기억하는 존재는 아닙니다. 먼저 언어 모델이란 무엇일까? 언어 모델은 어떤 문맥 뒤에 특정 단어나 토큰이 나타날 가능성을 계산합니다. “오늘 하늘이 매우 ___”라는 문장이 주어지면 ‘맑다’, ‘흐리다’, ‘어둡다’ 같은 후보에 서로 다른 확률을 부여하는 식입니다. 여기서 토큰(Token) 은 모델이 글을 처리하는 기본 단위입니다. 하나의 단어일 수도 있고, 단어의 일부나 문장 부호일 수도 있습니다. Google의 대규모 언어 모델 입문 자료 도 언어 모델을 긴 토큰 순서 안에서 토큰 또는 토큰 순서의 확률을 추정하는 모델로 설명합니다. LLM에서 ‘대규모’는 무엇을 뜻할까? ‘대규모’라는 말은 단순히 프로그램 파일이 크다는 뜻만은 아닙니다. 일반적으로 다음 요소들이 함께 커진 언어 모델을 가리킵니다. 학습 데이터: 다양한 주제와 표현이 담긴 많은 텍스트를 사용합니다. 파라미터: 학습으로 조정되는 수많은 가중치에 언어 패턴이 분산되어 반영됩니다. 계산량: 학습과 실행에 상당한 연산 자원이 필요할 수 있습니다. 문맥 처리: 여러 토큰 사이의 관계를 이용해 다음 내용을 예측합니다. 다만 크기만 키운다고 항상 좋은 모델이 되는 것은 아닙니다. 데이터 품질, 학습 방법, 모델 구조, 평가와 안전 조정도 결과에 큰 영향을 줍니다. LLM은 어떻게 학습할까? 대표적인 생성형 언어 모델의 기본 학습 목표는 앞의 ...

Transformer란? Attention으로 문맥을 한꺼번에 읽는 AI 구조

이미지
지난 글에서는 Attention(어텐션) 이 현재 필요한 정보와 입력 전체를 비교해 중요한 부분에 더 높은 가중치를 주는 원리를 살펴봤습니다. 그렇다면 이 Attention을 보조 기능이 아니라 모델의 중심 구조로 사용하면 어떻게 될까요? Transformer(트랜스포머) 는 Self-Attention을 중심으로 문맥을 처리하는 신경망 구조입니다. 단어를 반드시 처음부터 하나씩 읽으며 기억을 넘기는 대신, 입력 안의 여러 단어 관계를 직접 비교합니다. 현재 널리 쓰이는 언어 모델의 기반을 이해하려면 먼저 알아야 할 구조입니다. Transformer는 왜 등장했을까? RNN과 LSTM은 순서가 있는 데이터를 처리할 때 이전 단계의 상태를 다음 단계로 전달합니다. 하지만 이런 순차 구조는 문장이 길어질수록 먼 정보를 연결하기 어렵고, 앞 단계의 계산이 끝나야 다음 단계를 처리할 수 있다는 제약이 있습니다. 2017년 발표된 Attention Is All You Need 논문 은 순환 구조나 합성곱 없이 Attention을 중심으로 만든 Transformer를 제안했습니다. 핵심은 입력의 각 위치가 다른 모든 위치를 직접 참고하게 만드는 것입니다. Transformer의 핵심은 Self-Attention Self-Attention은 문장 안의 각 단어가 같은 문장의 다른 단어를 살펴보고, 자신을 이해하는 데 얼마나 중요한지 계산하는 방식입니다. 예를 들어 “철수가 영희에게 책을 주었고, 그녀는 웃었다”라는 문장에서 ‘그녀’의 의미를 파악하려면 ‘영희’와의 관계가 중요합니다. Self-Attention은 두 단어가 멀리 떨어져 있어도 직접 관련도를 계산할 수 있습니다. 지난 글에서 알아본 Query·Key·Value도 여기서 사용됩니다. 각 입력 표현으로부터 Query, Key, Value를 만들고, Query와 Key의 관련도에 따라 Value를 섞어 문맥이 반영된 새로운 표현을 만듭니다. 입력에는 단어 의미와 위치가 함께 들어간다 Tra...

Attention이란? AI가 필요한 정보에 집중하는 원리

이미지
지난 글에서는 LSTM이 셀 상태와 게이트를 이용해 필요한 정보를 오래 유지하는 방법을 알아봤습니다. 하지만 문장이 길어질수록 모든 정보를 하나의 기억에 압축해 전달하는 일은 여전히 어렵습니다. Attention(어텐션) 은 현재 처리하는 대상과 관련이 큰 입력을 직접 찾아 더 많이 참고하는 방식입니다. 쉽게 말하면 모든 내용을 똑같이 보는 대신, 지금 필요한 부분에 집중하는 것입니다. 왜 Attention이 필요할까? 긴 문장을 번역할 때 마지막까지 읽은 하나의 상태에 모든 내용을 담으려 하면 앞부분의 세부 정보가 약해질 수 있습니다. Attention은 출력할 단어마다 입력 전체를 다시 살펴보고 관련된 위치에 서로 다른 중요도를 부여합니다. 예를 들어 “고양이가 의자 위에서 잠을 잔다”를 번역하며 ‘잔다’에 해당하는 표현을 만들 때, 모델은 ‘고양이’와 ‘잠을 잔다’에 더 높은 비중을 둘 수 있습니다. 이 중요도를 어텐션 가중치 라고 합니다. Attention의 세 가지 요소 Attention은 보통 Query, Key, Value라는 세 요소로 설명합니다. Query(쿼리): 지금 찾고 싶은 정보, 즉 질문입니다. Key(키): 각 입력이 어떤 정보를 담는지 비교하기 위한 표식입니다. Value(값): 실제로 가져와 조합할 내용입니다. 도서관에 비유하면 Query는 찾는 주제, Key는 책의 분류 정보, Value는 책 안의 실제 내용입니다. 찾는 주제와 분류 정보가 잘 맞는 책일수록 더 자세히 참고합니다. Attention은 어떻게 계산될까? 현재 Query를 모든 Key와 비교해 관련도 점수를 구합니다. 점수를 정규화해 합이 1인 가중치로 바꿉니다. 각 Value에 해당 가중치를 곱합니다. 가중치가 적용된 Value들을 더해 문맥 벡터를 만듭니다. 관련도가 높은 입력은 결과에 크게 반영되고, 낮은 입력은 적게 반영됩니다. 모델은 정답을 잘 예측하도록 학습하면서 Query·Key·Value를 만드는 가중치를 조정합니다. ...

LSTM이란? RNN의 장기 기억 문제를 해결하는 세 가지 게이트

이미지
지난 글에서는 RNN이 은닉 상태를 다음 시점으로 전달하며 문장과 시계열처럼 순서가 있는 데이터를 처리한다는 것을 알아봤습니다. 하지만 기본 RNN은 단계가 길어질수록 오래전 정보가 희미해지는 장기 의존성 문제를 겪을 수 있습니다. 이 문제를 완화하기 위해 고안된 대표적인 구조가 LSTM(Long Short-Term Memory, 장단기 메모리) 입니다. LSTM은 무엇을 잊고, 무엇을 새로 기억하며, 어떤 정보를 밖으로 내보낼지 조절합니다. LSTM은 선택적으로 기억하는 RNN입니다 기본 RNN은 현재 입력과 이전 은닉 상태를 하나의 계산으로 갱신합니다. LSTM은 여기에 셀 상태(Cell State) 와 여러 게이트(Gate) 를 추가합니다. 셀 상태는 긴 시간 동안 중요한 정보를 운반하는 기억 통로입니다. 게이트는 0에서 1 사이의 값으로 정보가 얼마나 통과할지 조절하는 문과 비슷합니다. 0에 가까우면 대부분 막고, 1에 가까우면 대부분 통과시킵니다. LSTM 셀의 전체 흐름 LSTM은 현재 입력과 이전 은닉 상태를 함께 살펴본 뒤 세 가지 질문을 처리합니다. 기존 기억 중 무엇을 잊을까? 현재 정보 중 무엇을 새로 기억할까? 갱신된 기억 중 무엇을 출력할까? 각 질문을 담당하는 것이 망각 게이트, 입력 게이트, 출력 게이트입니다. 이 계산을 거쳐 새로운 셀 상태와 은닉 상태가 다음 시점으로 전달됩니다. 1. 망각 게이트: 불필요한 기억 지우기 망각 게이트(Forget Gate) 는 이전 셀 상태에서 유지할 정보와 줄일 정보를 결정합니다. 문장의 주제가 바뀌거나 오래된 정보가 더 이상 필요하지 않다면 해당 기억의 영향력을 낮출 수 있습니다. 망각은 기억 실패가 아니라 필요한 정보에 집중하기 위한 선택입니다. 모든 내용을 계속 보관하면 오히려 현재 판단에 방해가 될 수 있습니다. 2. 입력 게이트: 새로운 정보 기록하기 입력 게이트(Input Gate) 는 현재 입력에서 어떤 정보를 셀 상태에 새로 추가할지 정합니다. 현재 입력...

RNN이란? 순서와 기억을 처리하는 순환 신경망의 원리

이미지
지난 글에서는 CNN이 이미지에서 특징을 찾고 분류 결과를 만드는 전체 구조를 살펴봤습니다. CNN이 한 장의 이미지 안에 있는 공간적 특징을 잘 다룬다면, 단어가 이어지는 문장이나 시간에 따라 변하는 데이터는 어떻게 처리할까요? 이처럼 순서 가 중요한 데이터를 다루기 위해 등장한 대표적인 신경망이 RNN(Recurrent Neural Network, 순환 신경망) 입니다. 이번 글에서는 RNN이 이전 정보를 어떻게 다음 단계로 전달하는지, 어디에 활용할 수 있는지, 그리고 어떤 한계가 있는지 쉽게 알아보겠습니다. 순서가 중요한 데이터란? 문장은 같은 단어를 사용하더라도 순서에 따라 뜻이 달라질 수 있습니다. “고양이가 강아지를 쫓는다”와 “강아지가 고양이를 쫓는다”는 등장하는 단어는 비슷하지만 의미는 다릅니다. 주가, 기온, 심박수 같은 시계열 데이터도 이전 값과 현재 값의 흐름이 중요합니다. 이런 데이터를 각 항목이 서로 관계없는 것처럼 따로 처리하면 전체 맥락을 놓치기 쉽습니다. RNN은 데이터를 한 단계씩 순서대로 읽으면서 앞에서 얻은 정보를 다음 단계에 함께 전달합니다. RNN의 핵심은 순환하는 기억입니다 일반적인 신경망은 입력을 받아 출력을 만든 뒤 그 계산을 끝냅니다. 반면 RNN은 현재 입력을 처리한 결과의 일부를 다음 입력을 계산할 때 다시 사용합니다. 구조 안에서 정보가 순환한다고 해서 순환 신경망이라는 이름이 붙었습니다. 이때 이전 단계의 정보를 요약해 담는 값을 은닉 상태(Hidden State) 라고 합니다. 은닉 상태는 RNN의 짧은 메모장과 비슷합니다. 현재 입력: 지금 읽고 있는 단어나 현재 시점의 값 이전 은닉 상태: 앞부분에서 얻은 정보를 요약한 값 새 은닉 상태: 현재 입력과 이전 정보를 함께 반영한 결과 출력: 현재 단계에서 필요한 예측값 시간축으로 펼쳐 보면 더 쉽게 보입니다 RNN 그림에서는 하나의 신경망에 화살표가 되돌아오는 모습으로 표현되지만, ...

CNN 전체 구조란? 이미지 입력부터 분류 결과까지 한 번에 이해하기

이미지
지난 글에서는 특징맵의 크기를 줄이고 중요한 반응을 남기는 풀링(Pooling) 을 알아보았습니다. 지금까지 필터, 합성곱, 특징맵, 풀링을 하나씩 살펴봤다면 이제 이 부품들이 CNN 안에서 어떤 순서로 연결되는지 볼 차례입니다. CNN(Convolutional Neural Network, 합성곱 신경망) 은 이미지에서 특징을 추출하고, 그 특징을 바탕으로 무엇이 보이는지 판단하는 신경망입니다. 이번 글에서는 이미지 한 장이 CNN에 들어와 분류 결과가 되기까지의 전체 흐름을 초보자 눈높이에서 정리하겠습니다. CNN은 크게 두 부분으로 나뉩니다 CNN의 구조는 크게 특징 추출 부분 과 분류 부분 으로 나눌 수 있습니다. 특징 추출: 합성곱, 활성화 함수, 풀링 등을 거치며 선·모서리·질감·형태를 찾습니다. 분류: 추출한 특징을 종합해 고양이, 자동차, 사람처럼 최종 범주를 판단합니다. 쉽게 비유하면 특징 추출 부분은 사진에서 단서를 찾는 조사팀이고, 분류 부분은 모인 단서를 보고 결론을 내리는 판정팀입니다. CNN은 어떤 순서로 동작할까? 기본적인 이미지 분류 CNN은 다음과 같은 흐름으로 동작합니다. 입력 이미지 합성곱 층 활성화 함수 풀링 층 합성곱·활성화·풀링 반복 펼치기 또는 전역 평균 풀링 출력층에서 분류 결과 계산 1. 입력 이미지 CNN이 받는 이미지는 컴퓨터 안에서 숫자 배열로 표현됩니다. 흑백 이미지는 보통 밝기를 나타내는 하나의 채널을 사용하고, 컬러 이미지는 빨강·초록·파랑을 나타내는 여러 채널을 사용합니다. CNN은 그림을 사람처럼 바라보는 대신 이 숫자들을 계산합니다. 2. 합성곱 층에서 특징 찾기 합성곱 층(Convolutional Layer) 에서는 여러 필터가 이미지 위를 이동하며 특징을 찾습니다. 각 필터가 위치마다 보인 반응을 모으면 특징맵이 만들어집니다. 초기 층은 선, 방향, 모서리 같은 단순한 특징에 반응하는 경...

풀링(Pooling)이란? CNN이 특징맵을 작게 줄이는 방법

이미지
지난 글에서는 합성곱 연산으로 만든 특징맵(Feature Map) 이 이미지의 어느 위치에서 특정 특징이 강하게 나타났는지를 기록한다고 설명했습니다. 그런데 CNN은 이 특징맵을 그대로 다음 층에 전달하기도 하지만, 중간에 크기를 줄여 핵심 정보만 남기기도 합니다. 이때 사용하는 대표적인 연산이 풀링(Pooling) 입니다. 이번 글에서는 풀링이 특징맵을 어떻게 줄이는지, 최대 풀링과 평균 풀링은 무엇이 다른지, 그리고 풀링을 사용할 때 무엇을 조심해야 하는지 쉽게 알아보겠습니다. 풀링(Pooling)이란? 풀링은 특징맵의 작은 영역을 하나의 대표값으로 바꾸는 연산입니다. 예를 들어 4×4 크기의 특징맵을 2×2 영역씩 나누고 각 영역에서 하나의 값만 뽑으면, 결과는 2×2 크기로 줄어듭니다. 사진을 축소해 작은 미리보기를 만드는 과정과 비슷합니다. 모든 픽셀을 그대로 보존하지는 않지만, 전체적인 윤곽과 중요한 패턴은 알아볼 수 있도록 남기는 것입니다. CNN에서는 원본 이미지보다 합성곱을 거쳐 만들어진 특징맵에 풀링을 적용하는 경우가 많습니다. 풀링은 어떻게 작동할까? 풀링에도 특징맵을 훑어보는 작은 창이 필요합니다. 흔히 2×2 크기의 창을 사용하고, 창을 두 칸씩 이동하는 스트라이드(Stride) 2 를 적용합니다. 특징맵에서 2×2 영역을 선택합니다. 그 안의 값들을 정해진 규칙으로 하나의 값으로 바꿉니다. 창을 다음 위치로 이동해 같은 계산을 반복합니다. 각 영역에서 얻은 대표값을 모아 더 작은 특징맵을 만듭니다. 2×2 창과 스트라이드 2를 사용하면 가로와 세로 길이가 대체로 절반이 됩니다. 예를 들어 28×28 특징맵은 14×14로 줄어들 수 있습니다. 다만 입력 크기, 창 크기, 스트라이드와 패딩 설정에 따라 정확한 출력 크기는 달라집니다. 최대 풀링과 평균 풀링의 차이 최대 풀링(Max Pooling) 최대 풀링은 작은 영역 안에서 가장 큰 값 을 대표값으로 선택합니다. ...

특징맵(Feature Map)이란? CNN은 이미지의 특징을 어떻게 기록할까?

이미지
지난 글에서는 필터가 이미지 위를 조금씩 이동하며 중요한 특징을 찾는 합성곱(Convolution) 에 대해 알아보았습니다. 그렇다면 필터가 귀, 눈, 모서리 같은 특징을 찾은 뒤에는 무엇이 남을까요? 필터가 각 위치에서 계산한 결과는 사라지지 않습니다. 결과들이 차례대로 모여 새로운 지도를 만듭니다. 이 지도가 바로 특징맵(Feature Map) 입니다. 이번 글에서는 특징맵이 무엇인지, 왜 원본 이미지와 다르게 보이는지 누구나 이해할 수 있도록 쉽게 알아보겠습니다. 특징맵은 필터가 찾은 결과를 모은 지도입니다 필터는 이미지의 한 부분을 살펴볼 때마다 자신이 찾으려는 특징이 얼마나 강하게 나타나는지 계산합니다. 예를 들어 세로선을 찾는 필터라면 세로선이 뚜렷한 위치에서는 큰 반응을 보이고, 세로선이 거의 없는 위치에서는 작은 반응을 보입니다. 필터가 이미지 전체를 훑으며 만든 반응을 위치에 맞게 모으면 하나의 격자 모양 결과가 만들어집니다. 이것이 특징맵입니다. 필터 는 특징을 찾는 도구이고, 특징맵 은 그 도구가 어디에서 강하게 반응했는지 기록한 지도입니다. 원본 사진과 왜 다르게 보일까? 특징맵은 원본 사진을 복사한 이미지가 아닙니다. 필터가 관심을 가진 특징만 강조한 결과입니다. 고양이 사진에 모서리를 찾는 필터를 적용하면 털의 색이나 배경보다 귀의 경계, 눈의 윤곽, 수염처럼 선이 뚜렷한 부분이 더 강하게 나타날 수 있습니다. 그래서 특징맵을 눈으로 보면 원본보다 단순하거나 낯설게 느껴집니다. 중요한 것은 사진이 예쁘게 보이는지가 아니라, AI가 필요한 특징을 얼마나 잘 드러내는가 입니다. 강한 반응과 약한 반응은 무엇을 뜻할까? 특징맵의 각 칸에는 필터가 해당 위치에서 계산한 값이 들어 있습니다. 큰 값 : 필터가 찾으려는 특징과 잘 맞는 위치 작은 값 : 해당 특징이 약하거나 거의 없는 위치 특징맵을 그림으로 표현할 때는 큰 값을 밝게, 작은 값을 어둡게 표시하는 경우가 많습니다. 다만 색상과 ...