Deep Learning Classification Task: NER
[NER]
- Named Entity Recognition의 약자
- 문맥을 추론하여 해당 자리에 어떠한 종류의 단어가 들어갈지를 정하는 것이다.
- 미리 정의해 둔 사람, 회사, 장소, 시간, 단위 등에 해당하는 단어(개체명)를 문서에서 인식하여 추출 분류하는 기법이다.
- 추출된 개체명은 인명(person), 지명(location), 기관명(organization), 시간(time) 등으로 분류된다. 개체명 인식(NER)은 정보 추출을 목적으로 시작되어 자연어 처리, 정보 검색 등에 사용된다.
- 쉽게 표현하자면 ‘문자열을 입력으로 받아 단어 별로 해당되는 태그를 내뱉게 하는 multi-class 분류 작업’이라 말할 수 있다.
예를 들어보자.
아래의 문장들에서 문맥에 따라 각 분홍색에는,
PER
에는 사람이 들어가야 자연스럽다.LOC
에는 위치가 들어가야 자연스럽다.DATE
에는 날짜가 들어가야 자연스럽다.- 즉 이와 같이 각 단어에 대해 태그를 표현해주는 것이 NER이다.
[Simple NER]
- 그럼 간단한 NER로 설명을 더 구체적으로 해보자.
- 이는 binary logistic classifier를 이용한 Window classification이다.
- Idea: 각 단어를 인접 단어의 context window에 분류한다.
- window의 단어 word vectors 연결을 기반으로 각 클래스에 대해 중심 단어 {yes/no}를 분류하도록 손으로 레이블링된 데이터에 대한 logistic classifier 교육
- 사실, 우리는 보통 multi-class softmax를 사용하지만, 우리는 그것을 단순하게 유지하려고 노력하고 있다.(이진 분류기로!)
- 과정:
- 1) 각 단어 모두 아래와 같은 과정을 반복하는데 지금은 “Paris” 차례라고 가정해보자
- 2) 주위에 window를 만든다.
- 3) 5단어에 대해 word2vec이나 Glove를 통해 단어 벡터를 얻는다.
- 4) targrt 단어(“Paris”)가 중간에 오도록 5개의 단어 벡터를 연결하여 긴 벡터를 만들 것이다.
- 5) 그러고 나서 이렇게 만든 벡터를 classifier에 넣으면 classifier는 단어가 위치될 확률을 구할 수 있다.
- 6) 즉 그 결과 단어가 “위치(Paris니까)”일 확률을 말하는 분류기 획득이 가능하다.
- 7) 이러한 과정 모든 단어에 적용하여 각 단어에 대해 평가를 진행한다 window 길이가 2인 문장에서 “Paris”를 +(맞는 자리)/-(틀린 자리) 위치로 분류:
[NER의 쓰임]
- 자연어 처리를 이용한 정보 검색과 요약
- 질문 답변
- 지식 base build
- 기계 번역
- 즉, 명사를 잘못된 태그로 분류하면 번역 성능이 나빠질 수 있는데 (HOT DOG를 음식이 아닌 동물로 분류하면 해석이 이상해진다.) 이를 방지해 준다.
[NER의 계산]
- NER은 center word의 위치에 대한 이진 분류(+/-)이므로 아래와 같이 표현할 수 있다.
- 목적: 적절한 위치에 있을때 높은 점수를 내는 supervised training을 할 것이다.
- 계산 과정:
- 1) \(x(input)\):
- \(x\)는 중심 단어인 \(x_{Paris}\)를 중심으로 window size가 2인 벡터이다.
- 초기 벡터는 임의의 숫자를 사용하여 채점단어가 해당 위치일 확률 변환
- 2) \(h = f(W\)\(x\)\(+b)\):
- 위의 \(x(input)\)을 신경망 레이어에 넣는다. 그 결과 밀집 벡터(정보가 추가된 벡터)가 된다.
- \(W\): 신경망에서 학습할 단어의 가중치를 곱함
- \(b\): 단어를 보정해줄 bias를 더함
- \(f\): logistic, tanh, ReLU와 같은 non-linear function 활성화 함수
- \(h\): 그 결과 신경망 안의 은닉벡터가 된다.
- 3) \(s = u^{T}\)\(h\):
- 추가 벡터와 내적한다
- \(s\): 하나의 숫자로 임의의 숫자일 수 있다, 즉 점수(score)이다.
- 4) \(J_t(𝜃)\) = 𝜎(s) = \(\frac{1}{1+e^{-s}}\):
- 음수 샘플링할 때 봤던 것과 같이 같은 종류의 logisitc 변환
- \(J_t(𝜃)\): predicted model probability of class
- logisitc 변환: 아래의 그래프와 같이 s의 값에 따라 1이나 0에 근사한 극단적인 값으로 이진 분류됨
- 5) 출력은 특정 클래스에 단어가 속할 예측 확률
- 6) 이 출력을 진짜 정답과 비교하여 위치 단어일 확률에 대해 window의 각 단어를 분류할 수 있는 위치 분류기가 될 수 있음
- 1) \(x(input)\):
📜 Remember: Stochastic Gradient Descent
[SGD]
현재 손실을 기반으로 업데이트
- 앞의 식에서 진짜면 1
- 앞의 식에서 진짜가 아니면 0
데이터를 기반으로 신경망을 훈련시키면 매개변수의 기울기를 계산할 수 있어야 함
➡ 이러면 모델의 가중치를 반복적으로 업데이트하고, 모델을 효율적으로 훈련할 수 있음
➡ 좋은 가중치는 정확도가 높음
아래 식은 업데이트 방정식,
- 확률함수를 기반으로 손실을 최소화 하도록 계속 𝜃 값을 업데이트 해나간다.
\(∇_{𝜃}J(𝜃)\)을 계산하기 위해선,
- 손으로 계산 할 수 있다
- 그리고 backpropagation algorithm을 이용하여 계산가능하다 ➡ 이걸 배울 것이다
아래는 강의에는 언급되었지 않지만 슬라이드에 있어서 관연 정리 내용을 링크 걸어뒀다.
➕ 추가: Neural classification
➕ 추가: cross entropy loss
➕ 추가: Non-linearities (i.e., “f ” on previous slide): Why they’re needed
👀 강의 슬라이드 보기
Introduction
들어가기 전에 미분의 의미에 대해 직관적으로 파악해보자.
Gradients
[Basic 의미]
- \(f(x) = x^{3}\)와 같은 방정식이 있다고 해보자
- \(f(x)\): 1 output
- \(x^{3}\): 1 input
- 미분(Gradients)
- \(\frac{df}{dx}\) \(= 3x^{2}\): 위의 식을 미분한 것이다
- 이 미분값의 의미는 x가 1일 때 입력을 조금만 움직이면 출력이 3배만큼 변한다는 것이다
- ex1) At x = 1 it changes about 3 times as much: 1.013 = 1.03
- ex2) At x = 4 it changes about 48 times as much: 4.013 = 64.48
[복잡한 식에 적용]
- 그럼 이번엔 위의 미분의 의미를 되새겨 조금 더 복잡한 식의 의미를 찾아보자
- \(f(x) = f(x_1, x_2, ... , x_n)\)과 같은 방정식이 있다고 해보자.
- \(f(x)\): 1 output
- \(f(x_1, x2, ... , x_n)\): n input
- 미분(Gradients)
- \(\frac{∂f}{∂x} =\) \(( \frac{∂f}{∂x_1}, \frac{∂f}{∂x_2}, \frac{∂f}{∂x_n} )\): 위의 식을 미분한 것이다
- 기울기는 각 입력에 대한 편도함수의 벡터이다
- 우리는 \(x_1\)에서 \(x_n\)까지 n개의 입력을 얻었고,
\(x_1\)에 대한 \(f\)의 편도함수, \(x_2\)에 대한 \(f\)의 편도함수 등을 계산한 다음 편도함수의 벡터를 얻는다. - 이 벡터의 각 요소는 하나의 변수에 대한 단순 도한수와 같다.
👀 강의 슬라이드 보기
Jacobian Matrix
Gradient를 일반화 하는 것이다.
[더 복잡한 식에 적용]
- 그럼 위의 미분 의 이해식에서 더 복잡한 식에 적용해보자.
- \(f(x) = f_1(x_1, x_2, ... , x_n), ..., f_m(x_1, x_2, ... , x_n)\)과 같은 방정식이 있다고 해보자.
- \(f_1, ..., f_m\): m output
- \(f(x_1, x2, ... , x_n)\): n input
- 위 식의 적용
- 일반적으로 신경망에 레이어와 같은 것이 있을 때,
n개의 입력 내에 단어 벡터와 같은 함수가 있고, 행렬을 곱하는 것과 같은 작업을 수행한 m개의 출력을 갖게 됨 - 이제 n개의 입력을 받고 m개의 출력하는 함수가 생성된다
따라서 이 시점에서 기울기에 대해 계산하는 것을 Jacobian Matrix라고 한다.
- 일반적으로 신경망에 레이어와 같은 것이 있을 때,
- 미분(Gradients)
- 위의 식을 미분한 것이다
- 이 미분의 결과는 편도함수의 모든 조합에 대한 m x n 행렬이다.
- 따라서 함수 \(f\)는 각각 m개의 출력을 생성하는 \(f_1\)에서 \(f_m\)까지의 서로 다른 하위 함수로 분할됨
- 그래서 우리는 \(x_1\)에 대한 \(f_1\)의 편도함수를, \(x_n\)에 대한 \(f_1\)의 편도함수를 통해 취한다.
-
입력변수 중 하나에 대해 출력변수의 가능한 모든 편미분을 갖는다.
- 기울기는 각 입력에 대한 편도함수의 벡터이다
- 우리는 \(x_1\)에서 \(x_n\)까지 n개의 입력을 얻었고,
\(x_1\)에 대한 \(f\)의 편도함수, \(x_2\)에 대한 \(f\)의 편도함수 등을 계산한 다음 편도함수의 벡터를 얻는다. - 이 벡터의 각 요소는 하나의 변수에 대한 단순 도수와 같다.
➕ 이해가 힘들다면 이 링크를 눌러 Jacobian Matrix을 이해해보고 오는걸 추천한다
📜 Chain Rule
👀 강의 슬라이드 보기
Example Jacobian
요소별 activation 함수에 적용해 볼 것이다.
[목표]
- \(h = f(z)\) 일 때, \(\frac{∂h}{∂z}\) 구하기
- \(h,z ∈ ℝ^n\): \(h,z\)는 모두 실수이다
- \(f(z)\): 비선형벡터
- 이 함수는 n outputs and n inputs ➡ n by n Jacobian
[계산]
- 먼저 Jacobian의 정의를 보자.
- 각 입력에 개해 각 출력의 편도함수를 추정하는 것이다.
- 각 입력에 개해 각 출력의 편도함수를 추정하는 것이다.
- regular 1-variable derivative
- i=j가 아닌 입력은 출력에 아무런 영향을 미치지 않는다.
- i=j가 아닌 입력은 출력에 아무런 영향을 미치지 않는다.
- 그렇다면 \(\frac{∂h}{∂z}\)는,
- 대각선이 i=j이므로 이 외의 나머지는 다 0이다.
- 이는 단위행렬의 형태이다.
📜 단위행렬?
선형대수학에서, 단위 행렬(영어: unit matrix) 또는 항등 행렬(영어: identity matrix)은 주대각선의 원소가 모두 1이며 나머지 원소는 모두 0인 정사각 행렬이다.
출처: 위키백과
[Other Jacobians]
- 그럼 위의 식을 적용해서 아래의 식을 보자
- 아래의 식에다가 Jacobian 행렬식을 적용할 것이다.
- 아래와 같이 적용한 결과, 단위행렬이 나온다는 것을 알 수 있다(위에서 설명했다)
- h의 입력차원이 있고 하나의 출역이있으므로 행벡터를 위해 u를 transpose한다(추후 자세히 설명)
- 아래의 식에다가 Jacobian 행렬식을 적용할 것이다.
👀 강의 슬라이드 보기
Matrix calculus
그럼 위에 배운 내용들을 아까 배운 Neural Net에 적용해보자
Back to our Neural Net
[목표]
- 변수가 W, b, u가 되는 이 모델의 다른 매개변수에 대한 실수인 점수 s의 편도함수를 계산할 것이다.
- 먼저 편향 b의 gradient를 중심으로 계산할 것이다.
- 이 점수를 도출하는 식들을 계산하기 전에 계산을 간단하게 하는 방법을 살펴볼 것이다.
- 계산을 간단하게 하기 위해선 식들을 분해해야 한다.
1️⃣ Break up equations into simple pieces
- 아래와 같이 식을 조그만 조각으로 조각내고 각 차원이 뭔지 계산하는 것이 중요하다.
2️⃣ Apply the chain rule
- 그 다음 위에서 배운 chain rule을 적용하여 식을 더 작게 분할한다.
- 각 분할된 식은 같은 색의 네모로 표시했다.
3️⃣ Write out the Jacobians
- Jacobians 사용
- 그럼 위에서 배운식을 그대로 적용하여 분할한 식을 치환한다.
- 여기서 diag()는 대각행렬으로 단위행렬과 같이 대각선에만 0이 아닌 값들이 있지만 단위행렬과 달리 대각 성분들이 1이 아닌 다른 수이다.
- 변형
- ① \(diag(f'(z))I = f'(z)\)가 성립한다. 이유는 밑에 자세히 설명해두었다.
- ② 또한 ⊙는 아다마르곱(Hadamard product)으로 이 또한 밑에 자세히 설명을 해두었다.
- 위의 두 공식이 적용되어 치환한 식을 아래와 같이 변형시킬 수 있다.
📜 ① $$diag(f'(z))I = f'(z)$$
📜 ② 아다마르곱(Hadamard product)
👀 강의 슬라이드 보기
Re-using Computation
[가중치 W 계산]
- 식 정의
- 위에서는 편향 b를 계산하는 방법이었다.
- 그럼 가중치 W도 마찬가지로 계산하면 된다.
- 즉 목표는 \(\frac{∂s}{∂W}\) 로 점수에 가중치가 미치는 영향의 정도 계산이라고 보면 된다.
➡ 목표 식의 분모가 \(∂W\)이므로 마지막 항만 다르다. - 파란색 부분은 공통이라는 것을 알 수 있다.
➡ 즉 이 파란색 부분을 재사용하기 위해 위에서 배운 정보를 통해 일반화 할 것이다.
- \(𝛿\) 치환
- \(𝛿\): 이 기호의 의미는 local error signal이다.
- 위의 공통된 파란색 부분을 \(𝛿\)로 치환하면 이 치환한 부분은 Back to our Neural Net에 의해 아래와 같이 치환된다.
- 즉 W와 b 모두 같다는 것을 알 수 있다.
➡ 마지막 다른 항은 단위 행렬이라 계산에 영향을 주지 못하므로
👀 강의 슬라이드 보기
Output shape
위의 계산 과정에서 output shape를 조정하는 것이 중요하다.
현재 아래 식에 따르면 1 output, nm inputs이므로,
\(∇_{𝜃}J(𝜃)\)는 1 x n x m
의 shape을 갖은 매우 긴 밀도가 낮은 벡터가 출력될 것이다.
이렇게 Jacobian 형식은 chain rule을 쉽게 만들지만 이는 기울기 계산을 위한 SGD의 shape convention에 위배된다.
그런데, \(\frac{ds}{dW}\)는 점수라는 정수 하나가 출력되므로 위의 \(∇_{𝜃}J(𝜃)\)와 연산하지 못한다.
왜냐하면 같은 shape이 아니기 때문이다.
➡ 그러므로 계산을 위해 shape convention에 따라 shape을 맞춰주는 것이 중요하다.
즉 위의 문제를 해결하기위해 shape convention을 사용하여 아래와 같이 1 x n x m
shape으로 바꿔야 한다.
➡ 그 결과, shape of the gradient= shape of the parameters
가 된다.
그럼 위의 식을 앞에서 배웠던 \(𝛿\)로 나타내어 적용해보면 아래와 같다.
[Deriving local input gradient in backprop]
- 이 식에서 중요한 것은 \(W_{ij}\)는 오직 \(z_i\)에만 영항을 준다는 것이다.
- ex) \(W_{23}\) is only used to compute \(z_2\) not \(z_1\)
- ex) \(W_{23}\) is only used to compute \(z_2\) not \(z_1\)
- 그러므로 아래 식에서 영향을 주는 식들만 남기고,
\(\frac{∂}{∂W_{ij}}\)는 \(∂W_{ik}\) 와 상쇄되어 0이되므로 아래와 같은 식이 성립된다.
[derivatives를 위해 어떤 shape이어야 할까?]
- \(\frac{∂s}{∂b}\) = \(h^T\) \(⊙ f'(z)\)는 행(row)벡터이다.
➡ 그러나 shape convention에 의하면, b가 열(column) 벡터이기 때문에 gradient도 열(column) 벡터여야 한다 - Jacobian 형식(체인 규칙을 쉽게 만드는 것)과 shape convention(SGD를 쉽게 구현하는 것) 간의 불일치
➡ 즉 Jacobian form은 답을 계산하는 데 유용하지만 SGD를 위해 shape convention에 맞춰줘야 한다. - 두 가지 옵션:
- 1. Jacobian 형식을 최대한 사용하고, 마지막에 shape convention을 따르도록 모양을 바꿈
- 우리가 방금 한 것임. \(𝛿\) 까진 Jacobian 형식을 사용하다가 마지막에 도함수를 열 벡터로 만들기 위해 전치한다.
- 즉 결과는 \(𝛿^T\)이다.
- \(𝛿\) 항상 shape convention을 따름
- 차원을 검토하여 항을 전환 및/또는 재정렬할 시기를 파악한다.
- hidden layer에 도착하는 오류 메시지 \(𝛿\)은 해당 hidden layer과 shape이 같음.
- 1. Jacobian 형식을 최대한 사용하고, 마지막에 shape convention을 따르도록 모양을 바꿈
📜 Why the Transposes?
👀 강의 슬라이드 보기
Backpropagation
Backpropagation 즉 역전파는 아래 CS231n에서 해준 강의가 더 정확하고 이해하기 쉬워서 정리해둔 링크를 첨부했다.
링크로 걸어둔 포스트를 읽고 첨부한 슬라이드를 확인하면 이해가 정말 잘될 것이다