K 개발자

순환 신경망과 합성곱 신경망 본문

인공지능/핸즈온 머신러닝

순환 신경망과 합성곱 신경망

ddingz 2021. 1. 7. 19:51

순환 뉴런recurrent neuron과 순환 층

순환 신경망recurrent neural networks은 (활성화 신호가 입력층에서 출력층 한 방향으로만 흐르는) 피드포워드 신경망과 비슷하지만 뒤쪽으로 순환하는 연결도 있다는 점이 다르다. (입력을 받아 출력을 만들고 자신에게도 출력을 보내는 뉴런으로 구성)
각 타임 스텝time step $t$ (또는 프레임frame) 마다 순환 뉴런은 $x_ {(t)}$와 이전 타임 스텝의 출력인 $y_ {(t-1)}$을 입력으로 받는다. (첫 번째 타임 스텝에서는 이전 출력이 없으므로 일반적으로 0으로 설정)
각 순환 뉴런은 입력 $x_ {(t)}$와 이전 타임 스텝의 출력 $y_ {(t-1)}$을 위한 두 벌의 가중치를 가진다. (이 가중치 벡터를 $w_ {x}$와 $w_ {y}$라고 한다.)
하나의 순환 뉴런이 아니라 순환 층 전체를 생각하면 가중치 벡터를 가중치 행렬 $W_ {x}$와 $W_ {y}$로 바꿀 수 있다.
하나의 샘플에 대한 순환 층의 출력
$y_ {(t)}=\phi (W{_ {x}}^{T}x_ {(t)}+W{_ {y}}^{T}y_ {(t-1)}+b)$

  • $b$는 편향이고 $\phi(\cdot)$는 ReLU와 같은 활성화 함수

미니배치에 있는 전체 샘플에 대한 순환 뉴런 층의 출력
$Y_ {(t)}=\phi(X_ {(t)}W_ {x}+Y_ {(t-1)}W_ {y}+b)=\phi([X_ {(t)}Y_ {(t-1)}]W+b)\text{ 여기에서 }W=\begin{bmatrix}W_ {x}\\ W_ {y}\end{bmatrix}$

  • $Y_ {(t)}$는 타임 스텝 $t$에서 미니배치에 있는 각 샘플에 대한 층의 출력을 담은 $m\times n_ {neurons}$ 행렬 ($m$은 미니배치에 있는 샘플 수이고 $n_ {neurons}$는 뉴런 수)
  • $X_ {(t)}$는 모든 샘플의 입력값을 담은 $m\times n_ {inputs}$ 행렬 ($n_ {inputs}$는 입력 특성 수)
  • $W_ {x}$는 현재 타임 스텝의 입력에 대한 연결 가중치를 담은 $n_ {inputs}\times n_ {neurons}$ 행렬
  • $W_ {y}$는 이전 타임 스텝의 출력에 대한 연결 가중치를 담은 $n_ {neurons}\times n_ {neurons}$ 행렬
  • $b$는 각 뉴런의 편향을 담은 $n_ {neurons}$ 크기의 벡터
  • 가중치 행렬 $W_ {x}$와 $W_ {y}$는 종종 $(n_ {inputs}+n_ {neurons})\times n_ {neurons}$ 크기의 가중치 행렬 $W$ 하나로 연결
  • $[X_ {(t)}Y_ {(t-1)}]$ 표기는 행렬 $X_ {(t)}Y_ {(t-1)}$을 수평적으로 연결

메모리 셀memory cell

타임 스텝 $t$에서 순환 뉴런의 출력은 이전 타임 스텝의 모든 입력에 대한 함수이므로 이를 일종의 메모리 형태라고 말할 수 있다.
타임 스텝에 걸쳐서 어떤 상태를 보존하는 신경망의 구성 요소를 메모리 셀(혹은 셀)이라고 한다.
하나의 순환 뉴런 또는 순환 뉴런의 층은 짧은 패턴(일반적으로 10 스텝 길이 정도)만 학습할 수 있는 기본적인 셀
일반적으로 타임 스텝 $t$에서의 셀의 상태 $h_ {(t)}$(h는 히든hidden)는 그 타임 스텝의 입력과 이전 타임 스텝의 상태에 대한 함수 (i.e. $h_ {(t)}=f(h_ {(t-1)},x_ {(t)})$)
타임 스텝 $t$에서의 출력 $y_ {(t)}$도 이전 상태와 현재 입력에 대한 함수 (기본 셀의 경우 출력은 셀의 상태와 동일)

입력과 출력 시퀀스

시퀀스-투-시퀀스 네트워크sequence-to-sequence network

입력 시퀀스를 받아 출력 시퀀스를 만든다.
주식가격 같은 시계열 데이터를 예측하는 데 유용 (e.g. 최근 $N$ 일치의 주식가격을 주입하면 네트워크는 각 입력값보다 하루 앞선 $N-1$ 일 전부터 내일까지 가격을 출력)

시퀀스-투-벡터 네트워크sequence-to-vector network

입력 시퀀스를 네트워크에 주입하고, 마지막을 제외한 모든 출력을 무시
영화 리뷰에 있는 연속된 단어를 주입하면 네트워크는 감성 점수를 출력 (e.g. -1(싫다)에서 +1(좋다)까지)

벡터-투-시퀀스 네트워크vector-to-sequence network

각 타임 스텝에서 하나의 입력 벡터를 반복해서 네트워크에 주입하고, 하나의 시퀀스를 출력
이미지(또는 CNN의 출력)를 입력하여 이미지에 대한 캡션을 출력

인코더encoder-디코더decoder

인코더라 부르는 시퀀스-투-벡터 네트워크 뒤에 디코더라 부르는 벡터-투-시퀀스 네트워크를 연결
한 언어의 문장을 다른 언어로 번역하는 데 사용 (한 언어의 문장을 네트워크에 주입하면 인코더는 이 문장을 하나의 벡터 표현으로 변환하고, 그다음에 디코더가 이 벡터를 다른 언어의 문장으로 디코딩)
하나의 시퀀스-투-시퀀스 RNN을 사용하여 한 단어씩 번역하는 것보다 더 잘 작동 (문장의 마지막 단어가 번역의 첫 번째 단어에 영향을 줄 수 있기 때문)


RNN 훈련하기

RNN을 훈련하기 위한 기법은 타임 스텝으로 네트워크를 펼치고 보통의 역전파를 사용하는 것 (BPTTbackpropagation through time)


시계열 예측하기

데이터가 타임 스텝마다 하나 이상의 값을 가진 시퀀스일 때 시계열time series이라고 부른다.
웹사이트에서 시간당 접속 사용자의 수, 도시의 날짜별 온도 등은 타임 스텝마다 하나의 값을 가지므로 단변량 시계열univariate time series
여러 지표를 사용한 기업의 분기별 재정 안정성 등은 타임 스텝마다 여러 값(e.g. 회사의 수입, 부채 등)이 있으므로 다변량 시계열multivariate time series
미래의 값을 예측하는 것이 전형적인 작업 (예측forecasting)
또 다른 흔한 작업은 비어 있는 값을 채우는 것, 과거 데이터에서 누락된 값을 예측하거나 이전에 일어났던 일을 맞춘다. (값 대체imputation)

기준 성능

RNN을 시작하기 전에 기준 성능을 몇 개 준비하지 않으면 실제 기본 모델보다 성능이 나쁠 때도 잘 작동한다고 생각할 수 있다.
간단한 방법은 각 시계열의 마지막 값을 그대로 예측 (순진한 예측naive forecasting)
또 다른 간단한 방법은 완전 연결 네트워크를 사용


긴 시퀀스 다루기

긴 시퀀스로 RNN을 훈련하려면 많은 타임 스텝에 걸쳐 실행해야 하므로 펼친 RNN이 매우 깊은 네트워크가 된다. (그레이디언트 소실과 폭주 문제)

불안정한 그레이디언트 문제와 싸우기

불안정한 그레이디언트 문제를 완화하기 위해 좋은 가중치 초기화, 빠른 옵티마이저, 드롭아웃 등을 사용
그러나 수렴하지 않는 활성화 함수 (e.g. ReLU)는 출력이 폭주하는 걸 막지 못한다.
작은 학습률을 사용하여 이런 위험을 감소시킬 수 있지만 간단히 하이퍼볼릭 탄젠트 같은 수렴하는 활성화 함수를 사용
그레이디언트 자체가 폭주할 때는 그레이디언트 클리핑gradient clipping을 사용 (훈련이 불안정하다고 느껴지면 그레이디언트의 크기를 모니터링)
배치 정규화는 은닉 상태가 아니라 입력에 적용했을 때만 조금 도움이 된다.
다른 말로 하면 순환 층 안(i.e. 수평 방향)이 아니라 순환 층 사이(i.e. 수직 방향)에 적용했을 때 없는 것보다 조금 낫다.
RNN에서 잘 맞는 다른 종류의 정규화는 층 정규화layer normalization
배치 정규화와 비슷하지만 배치 차원에 대해 정규화하는 대신 특성 차원에 대해 정규화
한 가지 장점은 샘플에 독립적으로 타임 스텝마다 동적으로 필요한 통계를 계산 (훈련과 테스트에서 동일한 방식으로 작동한다는 것을 의미)
훈련 세트의 모든 샘플에 대한 특성 통계를 추정하기 위해 지수 이동 평균이 필요하지 않고 배치 정규화와 마찬가지로 입력마다 하나의 스케일과 이동 파라미터를 학습
RNN에서 층 정규화는 일반적으로 입력과 은닉 상태의 선형 조합 직후에 사용

단기 기억 문제 해결하기

RNN을 거치면서 데이터가 변환되므로 일부 정보는 매 훈련 스텝 후 사라진다. (어느 정도 시간이 지나면 RNN의 상태는 사실상 첫 번째 입력의 흔적을 가지고 있지 않다.)

LSTM 셀(장단기 메모리long short-term memory 셀)

핵심 아이디어는 네트워크가 장기 상태에 저장할 것, 버릴 것, 그리고 읽어들일 것을 학습하는 것
중요한 입력을 인식하고(입력 게이트의 역할), 장기 상태에 저장하고, 필요한 기간 동안 이를 보존하고(삭제 게이트의 역할), 필요할 때마다 이를 추출하기 위해 학습
시계열, 긴 텍스트, 오디오 녹음 등에서 장기 패턴을 잡아내는 데 놀라운 성과를 낸다.

핍홀 연결peephole connection

게이트 제어기에 장기 상태도 조금 노출시켜 좀 더 많은 문맥을 감지하게 만든다.
이전 장기 기억 상태를 삭제 게이트와 입력 게이트의 제어기에 입력으로 추가
그리고 현재의 장기 기억 상태를 출력 게이트의 제어기에 입력으로 추가
성능을 향상하는 경우가 많지만 늘 그렇지는 않다. (핍홀의 여부에 따라 어떤 종류의 작업이 좋아지는지 명확하지 않다.)

GRU 셀(게이트 순환 유닛gated recurrent unit 셀)

LSTM 셀의 간소화된 버전이고 유사하게 작동

1D 합성곱 층을 사용해 시퀀스 처리하기

합성곱 신경망에서 2D 합성곱 층이 이미지에 대해 몇 개의 매우 작은 커널이 (또는 필터가) 슬라이딩하여 (커널마다 하나씩) 2D 특성 맵을 만든다는 것을 보았다.
비슷하게 1D 합성곱 층이 몇 개의 커널을 시퀀스 위를 슬라이딩하여 커널마다 1D 특성 맵을 출력
각 커널은 매우 짧은 하나의 순차 패턴을 감지하도록 학습 (커널 크기보다 길지 않다.)
이는 순환 층과 1D 합성곱 층(또는 1D 풀링 층)을 섞어서 신경망을 구성할 수 있다는 뜻

WAVENET

이 네트워크는 층마다 (각 뉴런의 입력이 떨어져 있는 간격인) 팽창 비율dilation rate을 두 배로 늘리는 1D 합성곱 층을 쌓는다.
첫 번째 합성곱 층이 한 번에 2개의 타임 스텝만 바라보고 다음 층은 4개의 타임 스텝을 보고(i.e. 수용장 길이가 4개의 타임 스텝), 다음은 8개의 타임 스텝을 보는 식
이런 식으로 하위 층은 단기 패턴을 학습하고 상위 층은 장기 패턴을 학습 (팽창 비율을 두 배로 늘린 덕분에 네트워크는 아주 긴 시퀀스를 효율적으로 처리)
이런 팽창 비율을 가진 합성곱 층 $n$개가 $2^{n}$ 크기의 커널 한 개로 이루어진 효율적인 합성곱 층처럼 작동 (더 빠르고 강력하고 훨씬 적은 파라미터를 사용)
이런 이유로 이 블럭을 여러 개 쌓는다.
각 층 이전의 팽창 비율과 동일한 개수의 0을 입력 시퀀스 왼쪽에 패딩으로 추가하여 네트워크를 통과하는 시퀀스 길이를 동일하게 만든다.
실제와 같은 목소리를 여러 언어로 생성하는 텍스트 투 스피치text to speech 작업을 포함하여 여러 오디오 문제에서 최상의 성능을 달성
또한 이 모델을 사용해 한 번에 하나의 음악 오디오 샘플을 생성 (오디오 1초에 수만 개의 타임 스텝이 포함될 수 있기 때문에 이런 능력은 놀라우며 LSTM이나 GRU도 이렇게 긴 시퀀스를 다룰 수 없다.)


실습코드링크 : RNN과 CNN

'인공지능 > 핸즈온 머신러닝' 카테고리의 다른 글

오토인코더와 GAN  (0) 2021.01.26
순환 신경망과 어텐션  (0) 2021.01.16
합성곱 신경망  (0) 2020.12.28
텐서플로 데이터 API  (0) 2020.12.19
자동 미분  (0) 2020.12.10
Comments