안정민 2024. 11. 16. 15:20

7. Neural Networks.pdf
1.00MB

https://web.stanford.edu/~jurafsky/slp3/7.pdf

 

7.1 Units

computational unit은 하나의 계산 가능한 input을 받고, 이에 대해 계산을 실행한 뒤 output을 제공한다

unit에는 입력에 대한 계산을 수행하기 위해 weighted sum을 실행하는데, 이는 weight을 곱한 뒤 bias term을 더해주는 과정이다

x1...xn의 입력을 받는다면, 이 unit은 각각에 상응하는 weight 인 w1...wn 을 곱하고 bias인 b를 더하게 된다.

최종적인 weighted sum인 z의 모습은 다음과 같아진다.

그리고 이러한 수식은 weighted sum을 벡터의 형태로 나타내어 dot product를 수행하는 방식으로 수식을 표현하면 조금 더 간단하게 수식을 표현할 수 있게 된다.

그리고 output 결과물(a) 로서 z를 있는 그대로 활용하는 것이 아니라, nonlinear 한 function의 입력값으로 활용하여 데이터를 다른 데이터 공간에 매핑시키는 과정을 거치는데, 이 nonlinear function을 흔히 activation function 이라고 부른다.

activation function에는 여러 종류가 존재한다 (sigmoid, tanh, rectified linear unit, ReLU 등)

먼저 sigmoid function은 z값에 대해 다음과 같은 함수를 적용한다.

이와같은 sigmoid function은 z 값으로 어떤 값이 들어오든 간에 0과 1 사이의 값으로 데이터를 매핑시킨다.

따라서 모든 데이터에 대해 0과 1사이의 값으로 스케일을 압축시킬 때 유용하다.

최종적인 output을 이끌어내는 수식은 아래와 같이 정리할 수 있다. 아래 수식의 최종적인 답변 y가 해당 unit의 최종 출력이다.

 

실제 현장에서 sigmoid 함수는 자주 유용하게 사용되는 함수는 아니다. (** 이유 -> 너무 큰 값이 들어오면 도함수 값이 0에 매우 가까운 값으로 매핑 -> gradient vanishing problem)

그 다음 함수인 tanh 함수는 입력 값이 무엇이든 그 값을 -1과 1 사이의 값으로 매핑시킨다.

가장 간단하고 가장 많이 널리 사용되는 activation function 은 rectified linear unit이라고 불리는 ReLU이다. 

ReLU는 입력값 z가 양수라면 입력값을 그대로 취하고, z가 음수라면 0을 취하는 방법으로 데이터를 매핑시킨다.

각각의 activation function은 각기 다른 네트워크 구조에 유용하도록 서로 다른 특징을 가지고 있다.

예를 들어 tanh의 경우 부드럽게 미분할 수 있고 특이치 값을 평균에 매핑할 수 있는 좋은 속성을 가지고 있다

나아가 ReLU 함수의 경우 linear 값에 가까운 결과값을 출력 가능하다는 특징을 가지고 있으며, 도함수의 형태가 tanh와 sigmoid와 달리 큰 값이 들어오더라도 0으로 가까워지지 않기 때문에 gradient vanishing 문제가 발생하지 않는다. 

 

그리고 이 모든 과정을 도식화하면 다음 그림과 같다.

위의 neural unit은 3개의 input ( x1, x2, and x3)을 받고 출력값 y를 도출해내려고 하는 과정에 있다. 

각각의 입력 x에 상응하는 weight 값을 곱하고 곱해진 결과물들과 b를 더하는 weighted sum을 가장 먼저 진행하여 z값을 추출해낸다.

그 다음 z값을 입력으로 지정된 activation function을 계산하여 새로운 데이터 공간에 매핑된 값 a를 최종 출력값으로 채택한다.

 

 

7.2 The XOR Problem

MLP의 필요성을 가져온 문제는 Minsky and Papert으로부터 유래된 XOR 문제이다.

예를 들어 두 개의 input에 대해서 AND, OR, XOR 의 값을 도출해야하는 태스크를 수행해야한다고 가정하자

이 예시는 perceptron을 통해 처음으로 수행되었는데, 이 perceptron은 가장 activation function이 존재하지 않는 binary 결과값을 생성해내는 가장 간단한 unit이다.

결과값 y는 0 또는 1의 값으로만 구성되었고, 아래의 수식에 따라 계산되는 특성을 가진다고 가정하자.

하나의 퍼셉트론은 논리적 AND와 OR을 binary 값을 가지고도 잘 나타낼 수 있음을 확인하였다.

그러나 논리적 XOR을 계산하기 위해서는 하나의 unit으로는 올바른 결과값을 도출할 수 없음

즉, 한 개 이상의 decision boundary가 필요함

이러한 문제점에 대한 해결방안으로 제시되는 것은 Neural Network

XOR은 하나의 단일 퍼셉트론으로는 올바른 정답값을 도출해낼 수 없지만, 여러 개의 unit + nonlinear function (activation function)의 조합이 누적 layered network을 통해서 적절한 정답값을 도출 가능하다

두 개의 unit의 병랍으로 XOR의 true와 false의 경우를 선형적으로 쉽게 분리할 수 있고, 즉 네트워크의 은닉틍은 입력의 표현을 다양화할 수 있는 형상을 띈다는 것을 확인 가능하다

 

 

7.3 Feedforward Neural Networks

Feedforward Neural Network은 unit들이 순환되는 구조 없이 연결된 multilayer network를 의미하고, 

이 네트워크의 결과값은 더 높은 상위 계층으로 전달되고, 하위 계층으로의 전달은 없는 구조이다. -> 하위 계층으로 전달되어 네트워크가 순환하는 모양을 가지고 있으면 RNN

이러한 feedforward networks는 MLP (multi-layer perceptrons)이라고 불림 -> 이건 기술적으로 잘못된 명명이기는 한데, 왜냐하면 현대 사회의 네트워크는 퍼셉트론으로 구성되지 않았기 때문, 근데 그냥 이름이 굳어져버린 케이스

 

feedforward 네트워크의 경우 3 종류의 노드가 존재 => (1) input unit , (2) hidden unit, (3) output unit

(1) input unit들의 집합으로 이루어진 input layer x는 단순한 스칼라 값들로 이루어진 벡터의 형태이다

Neural Network의 핵심은 은닉층 h인데, 이 은닉층은 hidden units h로 이루어져있고, 이 층은 weight sum을 입력 x에 대해 수행하고 nonlinearity를 보장하기 위한 activation function을 거치게 됨

기본적인 구조는 fully-connected 구조임, 즉 모든 각각의 unit이 모든 그다음 계층의 unit과 연결되어있음

단일 은닉unit에는 가중치 벡터와 bias가 매개변수로 존재하고, 우리는 이를 W와 U, b라고 단일화하여서 나타낼 것임

하나의 통일된 W 행렬을 사용하는 것은 하나의 간단한 계산 만으로도 feedforward 연산이 가능하게 된다라는 것이 장점

 

입력층은 "층0"으로 지정, 입력값은 x로 나타내며 이는 n0차원의 실수 벡터로 나타내진다.

네트워크에는 은닉층, 즉, "층1"이 있고, 이 층의 차원은 n1이다.

 

**은닉층**

은닉층의 출력은 다음과 같은 식으로 계산된다

이 계산은 은닉층이 입력을 나타내는 "표현"을 형성한다는 것을 의미하며, 여기서 σ는 활성화함수이다 (시그모이드 혹은 ReLU)

은닉층에서 생성된 새로운 표현을 h라고 한다면, 은닉층에서 h를 받아 최종 출력을 계산하는 것이 출력층의 역할

이 출력은 실수 값일 수도 있으나 대부분의 경우 네트워크의 목표는 특정 분류 결정을 내리는 것 -> 하나의 값으로 귀결될 수 있는 출력을 만들기 위해 특정 방법론을 활용하여 데이터를 매핑할 수 있어야 함

 

 

**출력층**

분류작업 -> 이진 분류 작업의 경우 단일 출력 노드를 가지게 되며 노드 값에 따라 분류

다중 클래스 분류의 경우 (품사 태깅) 각 잠재적 품사에 대한 확률을 나타냄 -> 각 출력의 값은 해당 품사일 확률을 나타내며 이 경우 모든 출력 노드 값의 합계는 1이 되어야 함 (당연함 확률이니까)

 

출력층에 대한 계산도 은닉층을 통과한 결과값 h를 바로 내보내는 것이 아닌 nonlinear function 을 통과하여 변형

즉 아래의 식과 같은 과정을 거쳐야 함

 

**확률 분포로 변환하기 위한 소프트맥스 함수 softmax

z는 실수 벡터이기 때문에 분류기의 최종 출력으로 사용될 수 없으므로 분류 작업에서는 확률 벡터가 필요

소프트맥스 함수는 실수 벡터를 0과 1 사이의 확률로 변환하며, 모든 요소의 합이 1이 되는 확률 분포를 만들어준다.

모든 zj 값에 대해 exponential 값을 취한 것의 총 합에 대한 각각의 값의 비율을 확률분포로 취하게 됨

예를 들어, 벡터 z=[0.6,1.1,−1.5,1.2,3.2,−1.1]에 소프트맥스를 적용하면 확률 분포로 변환됩니다:

softmax(z)=[0.055,0.090,0.0067,0.10,0.74,0.010]

 

소프트맥스는 실수 벡터에서 확률 분포를 생성해냄 -> 다중 클래스 로지스틱 회귀의 다항 버전과 유사하게 작동한다

 

**최종 공식**

input x 벡터, output y는 확률 분포, 그리고 각 층의 파라미터 W와 U, 그리고 바이어스 b

 

(+) Logit

출력층 바로 앞의 활성화 값을 보통 로짓 (Logit)이라고 부름

즉, 소프트맥스 이전의 마지막 점수 벡터를 로짓이라고 하며, 이는 최종 확률분포를 계산하기 전의 비정규화된 값이다.

 

 

 

7.4 Feedforward networks for NLP : Classification

feedforward가 NLP에서는 어떻게 작동하는 지 알아볼 섹션 - Neural Language Modeling을 소개

 

2층 감정 분류기의 구조는 다음과 같을 수 있음

입력은 각각 hand-designed feature로 구성된다. 각 특징 xi는 특정 조건에 따라 계산된 값임

예를 들어 x1은 문서 내 단어의 개수, x2는 긍정적 감정 단어의 개수, x3은 문서에 no라는 단어가 포함되어있는지 여부와 같은 정보가 될 수 있음, 즉 단어 그대로를 넣는 것이 아니라 특정 feature을 추출해내어서 그걸 input으로 넣게 되는 것

-> 이건 객관성의 문제가 있을 수 있으니 나중엔 단어 하나하나를 벡터로 임베딩해서 넣음

 

출력층은 두 개의 노드 (긍정 및 부정 감정 클래스 두 개) 를 가질 수 있고, 세 개의 노드 (긍정, 부정, 중립 감정)을 가질 수도 있음, 중요한 건 출력층의 개수는 output class, 즉 분류하려는 클래스의 개수와 동일하게 가져감

 

최종적으로 아래의 수식을 통과하며 소프트맥스를 취해 각 확률값을 구하게 되고, 가장 높은 확률값의 출력층 노드가 해당 문제의 정답값으로 볼 수 있게 된

hand designed feature 구성은 이에 대한 객관성 문제 발생 가능, 대신 딥러닝의 데이터로부터 feature을 추출해서 학습하는 능력을 활용

텍스트를 임베딩(Word2Vec, GloVe) 으로 변환하여 단어를 벡터로 표현, 이 임베딩은 단어 수준의 정보를 벡터화한 것으로, 각 단어는 d차원의 벡터 e(wi)로 변환된다 -> 즉 차원은 보존되고 단어의 임베딩 개수는 하나로 줄어드는 것

그리고 텍스트의 모든 단어에 대해 생성된 임베딩의 평균을 계산하여 하나의 임베딩 벡터를 생성 -> 평균 풀링 (Mean Pooling)

이게 한 문장의 모든 단어를 mean으로 합쳐버린다는 건가...? 그러면 단어의 뜻이 뭉개져버리진 않을까...........?

 

여기서 n은 텍스트의 단어 수를, e(wi)는 각 단어의 임베딩 벡터를 의미한다.

이러한 평균 풀링 말고도 최대 풀링 (Max Pooling), 즉 각 차원에서 가장 큰 값을 선택하여 벡터를 생성해낼 수도 있다.

 

** 이미지에서의 풀링은 channel을 줄여주는 역할이었는데, NLP에서의 풀링은 단어의 임베딩을 단일 임베딩으로 만들고, 대신 차원 d는 유지시키는 기법이라고 보면 될 것 같음

 

풀링을 통해 단일 임베딩 벡터 x를 생성한 후, 신경망에 입력으로 사용

=> 풀링하는 이유 : texts come in different size, 즉 문장 단어 길이는 다 다름

(1) 가장 길이가 긴 문장에 맞춘 다음 짧아서 비는 공간은 0-padding => 메모리 낭비가 심함

(2) 하나의 sentence embedding 벡터로 변환

 

신경망의 계산 과정은 다음과 같음

h는 은닉층의 출력이며, 활성화함수를 사용하여 nonlinearity를 보장한다

z는 출력층의 중간 값으로, 로짓값이다.

y는 소프트맥스를 통해 계산된 최종 확률 값이다.

 

즉 하나의 단일 풀링 벡터를 여러 outputclass 개수만큼의 차원에 매핑, 그리고 사실 단어 하나하나도 단어 그대로가 매핑이 아니라 embedding for word 1241 와 같이 worddic에 있는 주소값으로 단어 연결

 

 

위 까지의 설명은 단일 입력 예제 x를 분류, 그러나 실제로는 m개의 예제로 구성이 된 전체 데이터세트를 효율적으로 처리해야한다.

이를 위해 반복문을 사용하여 위의 과정을 단순히 반복할 수도 있지만, 입력 데이터를 행렬로 변환하여 행렬 곱셈을 통해 전체 데이터세트를 한 번에 처리하기도 함.

 

먼저 입력 특징 벡터를 하나의 입력 행렬 X에 모은다

여기서 각 행은 개별 입력 예제의 풀링된 임베딩 벡터를 나타내고,

X의 크기는 [m*d] 가 된다, 즉 데이터세트의 예제 수(m) 와 각 임베딩 벡터의 차원(d) 만큼의 행렬이 발생

** Pretraining의 활용

word2vec이나 GloVe을 입력 표현을 임베딩하는데에 활용 -> 이미 사전에 학습된 임베딩을 입력으로 활용

-> 이는 입력 단어에 대한 임베딩 표현을 학습하기 위해 다른 알고리즘을 사용

-> 사전학습된 임베딩은 고정된 (static) 워드 임베딩이거나 (대표적으로 word2vec) 혹은 문맥적(contextual) 워드 임베딩 (Transformer) 일 수 있음

 

 

 

7.5  Feedforward Neural Language Modeling

Language Modeling : 단어 구성의 전적을 기반으로 그 다음에 위치할 단어의 확률을 계산하는 것

목표 : 현재까지의 시퀀스 다음에 위치할 단어 wt를 예측하라

방법 : sliding windows of fixed length (= N in Ngram model)

그러나 이와 같은 n-gram 언어 모델은 단순히 훈련 데이터에 존재하는 구체적인 패턴만 학습하기 때문에 보지 못 한 데이터에 대해 일반화하는 기능이 떨어지게 된다. 

 

예를 들어 훈련 데이터에서 다음과 같은 문장을 보았다고 가정하자

I have to make sure that the cat gets fed.

 

모델은 cat과 get fed의 연결을 학습하였으나, dog와 gets fed의 연결은 학습하지 않았음

I forgot to make sure that the dog gets ...

따라서 위와 같은 새로운 데이터가 입력되었을 때 fed가 올 가능성을 낮게 예측함

 

따라서 신경망 언어 모델은 "cat" 와 "dog"의 임베딩이 비슷하다는 것을 인식, 즉 두 단어가 유사한 문맥에서 사용될 수 있다는 것을 학습하게 된다

이로 인해 신경망 언어 모델은 "cat" 문맥에서 학습한 "gets fed"라는 패턴을 "dog" 문맥에도 일반화가 가능하다 => 벡터 간 거리가 가깝기 때문 !

 

결과적으로, 신경망 언어 모델은 "dog" 다음에 "fed"가 나올 확률을 높게 할당할 수 있게 되는 것 -> 일반화 가능, 조금 더 범용적인 사용이 가능해짐

 

 

(1) 신경망 언어 모델에서의 전방 추론 (Forward Inference)

 

Forward Inference, 즉 전방 추론이란, 주어진 입력에 대해 네트워크를 한 번 실행하여 가능한 출력 (다음 단어와 같이) 에 대한 확률 분포를 생성하는 작업

여기서는 언어 모델이 다음 단어를 예측하는 경우를 설명

 

각 단어는 원핫벡터로 표현 -> 어휘의 크기 V에 해당하는 길이를 가진 벡터임

원핫벡터는 특정 단어의 인덱스를 1, 나머지 모든 위치에 0을 가지는 벡터값, 예를 들어 toothpaste라는 단어가 단어 딕셔너리에 5번 째 위치에 있다면 인덱스 5번의 자리가 1의 값을 가지고, 나머지는 0의 값을 가진다.

 

(2) 임베딩 행렬을 사용한 변환

각 단어는 임베딩 행렬 E를 사용해 벡터로 변환된다

E는 d*V 크기의 행렬 (d는 임베딩 벡터의 차원, V는 어휘의 크기)이고, E의 각 열은 어휘의 각 단어에 해당하는 d차원의 임베딩 벡터를 나타낸다.

그러니까 원핫벡터가 거의 1*1 convolution과 같은 역할을 해서 하나의 임베딩 벡터로 만드는 것이라고 보면 될 것 같은데

 

(3)피드포워드 신경망의 구조

전방 추론 과정은 이전 𝑁 단어를 입력으로 받아 신경망을 통과시켜 다음 단어의 확률 분포를 예측합니다.

각 단어는 임베딩 벡터로 변환된 후, 피드포워드 신경망에 전달됩니다.

특정 단어의 원-핫 벡터를 𝐸와 곱하여 임베딩 벡터를 생성합니다.

 

**쫄지마 달라진 거 임베딩 원핫으로 하는 거밖에 없어

그리고 학습 시 gradient update는 다음과 같은 방법으로 진행함