Chapter 09 텍스트를 위한 인공 신경망 ▶ 한빛 마켓의 댓글을 분석하라!
09-1 순차 데이터와 순환 신경망 ▶ 순차 데이터의 특징과 개념 이해하기
학습 목표
- 순차 데이터의 특징을 알고 순환 신경망의 개념을 학습합니다.
순차 데이터
- 순차 데이터(sequential data)
- 단어의 순서 중요
- 시계열 데이터(time series data)
- 일정한 간격으로 기록된 데이터
- 피드 포워드 신경망(feedforward neural network, FFNN)
- 입력 데이터의 흐름이 앞으로만 전달되는 신경망
- ex. 완전 연결 신경망 & 합성곱 신경망
- 순환 신경망
- 데이터 재사용 必
순환 신경망
- 순환 신경망(recurrent neural network, RNN)
- 은닉층에 층 단계 추가
- 타임 스텝(timestep)
- 이전 샘플에 대한 데이터 처리
- 오래될수록 순화되는 정보는 희미해짐
- 순환 신경망에서 층 = 셀(cell)
- 셀의 출력 = 은닉 상태(hidden state)
- 기본 구조는 같다.
- 입력에 어떤 가중치를 곱하고 활성화 함수를 통과시켜 다음 층으로 보내짐.
- 달라지는 것: 층의 출력(즉 은닉 상태)을 다음 타임 스텝에 재사용한다는 것
- 은닉층의 활성화 함수
- 하이퍼볼릭 탄젠트(hyperbolic tangent); tanh^2
- 순환 신경망의 활성화 함수
- tanh 함수: -1~1 사이의 범위를 가짐
- 시그모이드 함수라고도 부르나, 우리가 알고 있는 시그모이드 함수는 0~1사이 범위를 가짐.
- 신경망 비교
- 피드포워드 신경망에서의 뉴런: 입력 x 가중치 / 하나의 절편
- 순환 신경망에서의 뉴런: 입력 x 가중치 x 가중치(은닉 상태에 곱해지는) / 하나의 절편
- 셀: 입력과 이전 타임스텝의 은닉 상태를 사용 → 현재 타임스텝의 은닉 상태 만듦.
셀의 가중치와 입출력
- 순환층 예시
- 특성의 개수: 4, 순환층의 뉴런: 3개
- 가중치 Wx: 4 x 3 = 12개
- 가중치 Wb
- 순환층에서 다음 타임스텝에 재사용되는 은닉 상태를 위한 가중치
- 3 x 3 = 9
- 모델 파라미터 (순환층의 가중치 크기)
- 모델 파라미터 수 = Wx + Wb + 절편 = 12 + 9 + 3 = 24
- 합성곱 층의 입력
- 하나의 샘플이 3개의 차원을 가짐: 너비, 높이, 채널
- 입력이 합성곱 층과 풀링 층을 통과하면 너비, 높이 채널(혹은 깊이)의 크기가 달라짐
- But, 차원의 개수는 유지
- 순환층의 입력
- 하나의 샘플이 2개의 차원을 가짐.
- 하나의 샘플 = 하나의 시퀀스(sequence)
- 여러 개의 아이템
- 시퀀스의 길이 = 타임스텝 길이
- 너비(시퀀스 길이), 높이(단어 표현), 채널(샘플) ⇒ 순환층 통과 ⇒ 두 번째, 세 번째 차원 사라짐 = 뉴런 개수만큼만 출력
- 하나의 샘플 (2차원)
- 시퀀스 길이(단어 개수)
- 단어 표현
- 순환층 통과
- 하나의 샘플(1차원)으로 변경
- 1차원 배열의 크기 = 순환층 뉴런의 개수로 결정.
- 하나의 샘플(1차원)으로 변경
- 하나의 샘플 (2차원)
- 마지막 타임 스텝의 은닉 상태만 출력으로 내보냄(h_f)
- 순환 신경망의 출력층 구성
- 밀집층(출력층)
- 다중 분류: 클래스 개수만큼 뉴런을 두고 → 소프트맥스 활성화 함수 사용
- 이진 분류: 하나의 뉴런을 두고 → 시그모이드 함수 사용
- 합성곱 신경망과 다른 점
- 마지막 셀의 출력이 1차원이므로, Flatten 클래스로 펼칠 필요 X
- 밀집층(출력층)
키워드로 끝내는 핵심 포인트
- 순차 데이터
- 텍스트나 시계열 데이터와 같이 순서에 의미가 있는 데이터
- ex. 글, 대화, 일자별 날씨, 일자별 판매 실적 등
- 텍스트나 시계열 데이터와 같이 순서에 의미가 있는 데이터
- 순환 신경망
- 순차 데이터에 잘 맞는 인공 신경망의 한 종류
- 순차 데이터를 처리하기 위해 고안된 순환층을 1개 이상 사용한 신경망
- 순환 층 = 셀
- 셀은 여러 개의 뉴런으로 구성
- 셀의 출력
- 은닉 상태
- 다음 층으로 전달
- 셀이 다음 타임스텝의 데이터를 처리할 때 재사용
확인 문제
- 다음 중 순차 데이터로 처리하기 어려운 작업은 무엇인가요?
- 정답: 1번 / 환자의 검사 결과를 바탕으로 질병 예측하기
- 순환 신경망에서 순환층을 부르는 다른 말과 순환층의 출력을 나타내는 용어를 올바르게 짝지은 것은 무엇인가요?
- 정답: 4번 / 셀(cell) - 은닉 상태
- 순환 신경망에서 한 셀에 있는 뉴런의 개수가 10개입니다. 이 셀의 은닉 상태가 다음 타임스텝에 사용될 때 곱해지는 가중치 wh의 크기는 얼마인가요?
- 정답: 2번 / (10, 10)
- 해설: (셀의 뉴런 개수, 셀의 뉴런 개수)
09-2 순환 신경망으로 IMDB 리뷰 분류하기 ▶ 텐서플로 순환 신경망으로 영화 리뷰 분류하기
학습 목표
- 텐서플로를 사용해 순환 신경망을 만들어 영화 리뷰 데이터셋에 적용해서 리뷰를 긍정과 부정으로 분류합니다.
IMDB 리뷰 데이터셋
- 자연어 처리(natural language processing, NLP)
- 컴퓨터를 사용해 인간의 언어를 처리하는 분야
- EX. 음성 인식, 기계 번역, 감성 분석 등
- 말뭉치(corpus)
- 자연어 처리 분야에서의 훈련 데이터
- IMDB 리뷰 분류 작업: 감성 분석에 해당
- 텍스트 자체를 신경망에 전달 X
- 텍스트 데이터의 경우 단어를 숫자로 바꿔 전달
- 데이터에 등장하는 단어마다 고유한 정수 부여
- 토큰(token)
- 분리된 단어
- 하나의 샘플은 여러 개의 토큰으로 이루어짐
- 1개의 토큰 = 하나의 타임스텝
- 토큰에 할당되는 정수 중 예약되어 있는 정수 有
- 0: 패딩
- 1: 문장의 시작
- 2: 어휘 사전에 없는 토큰
- 어휘 사전
- 훈련 세트에서 고유한 단어를 뽑아 만든 목록
- 한글에서의 토큰화
- 한글은 조사가 발달한 특징이 있음.
- 따라서, 한글은 형태소 분석을 통해 토큰을 만듦.
- (참고) KoNLPy를 사용한 한글의 형태소 분석
- 파이썬 라이브러를 활용한 머신러닝(개정판)_7장
- IMDB 리뷰 데이터셋
- 영어로 된 문장
- 텐서플로에는 이미 정수로 바꾼 데이터 포함.
순환 신경망 만들기
- 원-핫 인코딩
- 토큰을 정수로 변환한 데이터를 신경망에 주입하면 큰 정수가 큰 활성화 출력을 만듦.
- So, 원-핫 인코딩으로 각 정수를 고유하게 표현함
- 정숫값 배열에서 해당 정수 위치의 원소: 1
- 나머지: 0
- keras.utils.to_categorical() 사용
순환 신경망 훈련하기
단어 임베딩을 사용하기
- 단어 임베딩(word embedding)
- 각 단어를 고정된 크기의 실수 벡터로 바꿔줌.
- 이러한 벡터는 원-핫 인코딩된 벡터보다 훨신 의미 있는 값으로 채짐.
- 자연어 처리에서 더 좋은 성능을 냄.
- keras.layers.Embdding() 클래스 사용
- 장점
- 입력으로 정수 데이터를 받음.
키워드로 끝내는 핵심 포인트
- 말뭉치
- 자연어 처리에서 사용하는 텍스트 데이터 모음 = 훈련 데이터
- 토큰
- 텍스트에서 공백으로 구분되는 문자열
- 원-핫 인코딩
- 어떤 클래스에 해당하는 원소만 1이고 모두 0으로 변환하는 벡터
- 정수로 변환된 토큰을 원-핫 인코딩으로 변환 → 어휘 사전 크기의 벡터가 만들어짐.
- 단어 임베딩
- 정수로 변환된 토큰을 비교적 작은 크기의 실수 밀집 벡터로 변환
- 이 밀집 벡터는 단어 사이의 관계 표현 가능 → 자연어 처리에서 좋은 성능 발휘
핵심 패키지와 함수
- TensorFlow
- pad_sequence(샘플 개수, 타임스텝 개수)
- 시퀀스 길이를 맞추기 위해 패딩 추가
- maxlen 매개변수: 시퀀스 길이 지정
- 이 값보다 긴 시퀀스는 짤림.
- 이 값보다 작은 시퀀스는 패딩됨. (0으로)
- 이 매개변수를 지정하지 않으면 가장 긴 시퀀스의 길이가 됨.
- padding 매개변수: 패딩을 추가할 위치 지정
- default: pre (시퀀스 앞에 패딩 추가)
- post (시퀀스 뒤에 패딩 추가)
- default: pre (시퀀스 앞에 패딩 추가)
- truncating 매개변수: 긴 시퀀스에서 잘라버릴 위치 지정
- default: pre (시퀀스 앞부분 잘라내기)
- post (시퀀스 뒷부분 잘라내기)
- default: pre (시퀀스 앞부분 잘라내기)
- to_categorical(): 정수 시퀀스를 원-핫 인코딩으로 변환
- 토큰 or 타깃값 원-핫 인코딩에 사용
- num_calsses 매개변수: 클래스 개수 지정
- default: 지정하지 않으면 데이터에서 자동으로 찾음.
- SimpleRNN: 케라스의 기본 순환층 클래스
- 첫 번째 매개변수: 뉴런의 개수 지정
- activation 매개변수: ghkftjdghk gkatn wlwjd
- default: 하이퍼볼릭 탄젠트(tanh)
- dropout 매개변수: 입력에 대한 드롭아웃 비율 지정
- return_sequences 매개변수: 모든 타임스텝의 은닉 상태 출력할 지정
- default: False
- Embedding: 단어 임베딩을 위한 클래스
- 첫 번째 매개변수: 어휘 사전의 크기 지정
- 두 번째 매개변수: Embedding 층이 출력할 밀집 벡터의 크기 지정
- input_length 매개변수: 입력 시퀀스의 길이 지정
- Embedding 층 바로 뒤에 Flatten이나 Dense 클래스가 올 때 꼭 필요
- pad_sequence(샘플 개수, 타임스텝 개수)
확인 문제
- pad_sequences(5, padding=’post’, truncating=’pre’)로 했을 때 만들어질 수 없는 시퀀스는 무엇인가요?
- 정답: 2번 / [0, 0, 10, 5, 7]
- 케라스에서 제공하는 가장 기본적인 순환층 클래스는 무엇인가요?
- 정답: 4번 / SimpleRNN
- 어떤 순환층에 (100, 10) 크기의 입력이 주입됩니다. 이 순환층의 뉴런 개수는 16개입니다. 이 층에 필요한 모델 파라미터 개수는 몇 개 인가요?
- 정답: 3번 / 432개
- 해설: 10 x 16 + 16 x 16 + 16 = 432개
09-3 LSTM과 GRU 셀 ▶ 순환 신경망의 중요 기술을 사용해 모델 만들어 보기
학습 목표
- 순환 신경망에서 빼놓을 수 없는 핵심 기술인 LSTM과 GRU 셀을 사용한 모델을 만들어 봅니다.
- 기본 순환층은 긴 시퀀스 학습이 어려움 → 시퀀스가 길수록 순환되는 은닉 상태에 담긴 정보가 희석됨.
- So, LSTM와 GRU가 등장함.
LSTM 구조
- Long Short-Term Memory
- 단기 기억을 오래 기억하기 위해 고안됨.
- 은닉 상태 만드는 방법
- 입력과 이전 타임스텝의 은닉 상태를 가중치에 곱한 후 활성화 함수를 통과 시켜 다음 은닉 상태를 만듦.
- 이때 기본 순환층과 달리 시그모이드 활성화 함수를 사용.
- tanh 활성화 함수를 통과한 어떤 값과 곱해져서 은닉 상태를 만듦.
- 입력과 이전 타임스텝의 은닉 상태를 가중치에 곱한 후 활성화 함수를 통과 시켜 다음 은닉 상태를 만듦.
- LSTM에는 순환되는 상태가 2개
- 은닉 상태(hidden state) + 셀 상태(cell state)
- 셀 상태: LSTM 셀에서 순환만 되는 값
- 은닉 상태(hidden state) + 셀 상태(cell state)
- LSTM은 마치 작은 셀을 여러 개 포함하고 있는 큰 셀
- LSTM에는 총 4개의 셀 有
- 게이트
- 삭제 게이트: 셀 상태에 있는 정보를 제거하는 역할
- 입력 게이트: 새로운 정보를 셀 상태에 추가하는 역할
- 출력 게이트: 이 셀 상태가 다음 은닉 상태로 출력됨.
LSTM 신경망 훈련하기
순환층에 드롭아웃 적용하기
- 순환층은 자체적으로 드롭아웃 기능 제공
- dropout 매개변수: 셀의 입력에 드롭 아웃
- recurrent_dropout: 순환되는 은닉 상태에 드롭 아웃
2개의 층을 연결하기
GRU 구조
- Gated Recurrent Unit
- LSTM의 간소화된 버전
- LSTM보다 가중치가 적기 때문에 계산량이 적지만 LSTM 못지않은 좋은 성능을 내는 것으로 알려져 있음.
GRU 신경망 훈련하기
[문제해결 과정] LSTM과 GRU 셀로 훈련
키워드로 끝내는 핵심 포인트
- LSTM 셀
- 타임스텝이 긴 데이터를 효과적으로 학습하기 위해 고안된 순환층
- 입력 게이트, 삭제 게이트, 출력 게이트 역할을 하는 작은 셀 포함
- 은닉 상태 외에 셀 상태도 출력
- 셀 상태: 다음 층으로 전달 X, 현재 셀에서만 순환
- GRU 셀
- LSTM 셀의 간소화 버전 → LSTM 셀에 못지 않는 성능 발휘
핵심 패키지와 함수
- TensorFlow
- LSTM: LSTM 셀을 사용한 순환층 클래스
- 첫 번째 매개변수: 뉴런의 개수 지정
- dropout 매개변수: 입력에 대한 드롭아웃 비율 지정
- return_sequences 매개변수: 모든 타임스텝의 은닉 상태를 출력할지 결정
- default: False
- GRU: GRU 셀을 사용한 순환층 클래스
- 첫 번째 매개변수: 뉴런의 개수 지정
- dropout 매개변수: 입력에 대한 드룹아웃 비율 지정
- return_sequences 매개변수: 모든 타임스텝의 은닉 상태를 출력할지 결정
- LSTM: LSTM 셀을 사용한 순환층 클래스
확인 문제
- 다음 중 텐서플로에서 제공하는 순환층 클래스가 아닌 것은 무엇인가요?
- 정답: 4번 / Conv2D
- LSTM 층에 있는 게이트가 아닌 것은 무엇인가요?
- 정답: 1번 / 순환 게이트
- 순환층을 2개 이상 쌓을 때 마지막 층을 제외하고는 모든 타임스텝의 은닉 상태를 출력하기 위해 지정해야 할 매개변수는 무엇인가요?
- 정답: 2번 / return_sequences
번외주차 학습 소감
텍스트처리는 졸업 작품을 진행하면서 한 번 다뤄본 적이 있었다. 하지만, 그때는 오로지 작품 구현에 집중하다보니 어떠한 방식과 이론을 바탕으로 구동되는지 이해하기 어려웠다. 이번 마지막 학습을 통해서 인공지능을 활용한 텍스트 처리를 위해서는 문장에 대한 토큰화가 왜 필요하고, 토큰화된 단어들을 보다 효율적으로 학습시키기 위해 '원-핫 인코딩', '단어 임베딩' 등의 기법이 사용된다는 사실을 자세한 그림들과 함께 학습할 수 있었다. 하지만, 타임텝스에 대한 개념은 한 번만 봐서는 이해가 어려워, 여러 번 반복해 학습할 수 밖에 없었다. 생성형 AI가 강세를 보이고 있는 만큼 정말 재미있는 학문으로서 다음 공부로는 자연어 처리(NLP)와 생성형 AI를 중점으로 진행해야 겠다.
번외주차 손코딩 자료
반응형
'코딩 | 개념 정리 > Machine Learning & Deep Learning' 카테고리의 다른 글
[MustHave] 1단계: 딥러닝 입문하기 (0) | 2024.03.02 |
---|---|
[혼공머신] 혼공학습단 11기_학습 회고 (0) | 2024.02.18 |
[혼공머신] 번외주차_이미지를 위한 인공 신경망 (0) | 2024.02.17 |
[혼공머신] 6주차_딥러닝을 시작합니다. (0) | 2024.02.11 |
[혼공머신] 5주차_비지도 학습 (0) | 2024.02.03 |