Transformer and Bert#
2018๋
๋น์์ ๋ด์ฅ ํ์์ง์์ Oren Etzioni, chief executive of the Allen Institute for Artificial Intelligence
๊ฐ ๋งํ๊ธธ,
๊ธฐ๊ณ๊ฐ ์์ง ์ธ๊ฐ์ ๋ณดํต ๊ฐ๊ฐ์ ํํํ ์๋ ์์ง๋ง, Bert๋ ํญ๋ฐ์ ์ธ ๋ฐ์
์ ์๊ฐ์ด๋ผ๊ณ ํ์ต๋๋ค.
์ด Bert ๋ชจ๋ธ์ ๊ธฐ์ด๊ฐ ๋ Transformer๋ ์ดํ
์
๋งค์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ Encoder-Decoder๋ก ๊ตฌ์ฑ๋๋ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ ค๊ณ ํฉ๋๋ค.

๋ํ Bert๊ตฌํ์ ๋ฐํ์ด ๋ฌ๋ค๊ณ ์ง์ ๋ ผ๋ฌธ์์ ์ธ๊ธํ The Annotated Transformer๋ ๋ด ๋๋ค
Attension Mechanism#
์ดํ ์ ์ ํน์ ์ํ์ค๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด ์ ๋ ฅ ์ํ์ค์ ์ด๋ ํ ๋ถ๋ถ์ ๊ฐ์กฐํด์ผ ๋ ๋์ง ํ์ต์ ํ ์ ์๋ ๋งค์ปค๋์ฆ์ด๋ค.

์ดํ ์ ๋ฉ์ปค๋์ฆ์ ๊ฐ๋จํ ๋งํด์ ํน์ ๋จ์ด๋ฅผ ๊ฐ์กฐํ๋ ๊ฒ์ด๋ค. ์ ๋ ฅ ์ํ์ค ์ค์์ ํน์ ๋จ์ด์ ๋ค๋ฅธ ๋จ์ด๊ฐ ์ํ์ค์์ ์ถํ์ ๊ฐ์กฐ๋๋ ๊ฒ์ด๋ฉฐ, ๊ทธ๋ฌํ ๊ฐ์กฐ ์ ๋ณด๊ฐ ์ ๋ ฅ ์ํ์ค์ ์ ์ฉ๋์ด์ ๋์ฝ๋์ ์ ๋ ฅ๋๊ณ , ๋งค ๋์ฝ๋ ์ํ์ค๋ง๋ค ์ด๋ฌํ ๊ณ์ฐ์ด ์งํ๋๋ฉฐ ์๋ง์ ๋ฌธ์ฅ์ด ํ์ต๋๋ฉด์ ์ธ์ฝ๋ ๋์ฝ๋์ ์ ๋ ฅ๋๋ ๋จ์ด๋ค์ ์ํธ๊ฐ์ ์ปจํ ์คํธ๊ฐ ํ์ต์ด ๋๋ ๊ตฌ์กฐ์ด๋ค.

$$score(s_t, h_i )= s_t^T h_i \e^t=[s_t^T h_1,โฆ,s_t^T h_N] \a^t=softmax(e^t) \c_t = \sum_{i=1}^{N}a_i^t h_i$$
์ ๋
ผ๋ฌธ์์๋ t๋ฅผ ํ์ฌ์์ ์ด๋ผ๊ณ ํ ๋, ์ธ์ฝ๋ ์ถ๋ ฅ๋ฒกํฐ(s)์ ์๋ ์ํ ๋ฒกํฐ(h)๋ฅผ ๋ด์ ํ ํ์ ์ํํธ๋งฅ์ค(softmax)๋ฅผ ํ๋ค๋ฉด ์ด๋ฅผ ์ดํ
์
๋ถํฌ(attention distribution), ๊ฐ๊ฐ์ ๊ฐ์ ์ดํ
์
๊ฐ์ค์น(attention weight)๋ผ๊ณ ํฉ๋๋ค. ์ด ๊ฐ์ค์น๋ฅผ ๋ชจ๋ ๋ํ๋ค๋ฉด ์ต์ข
์ถ๋ ฅ ์ดํ
์
๊ฐ(attention value)์ด์ ๋ฌธ๋งฅ ๋ฒกํฐ(context vector)
๋ผ๊ณ ์ ์ํ๋ค. ๊ทธ ํ ์ค์ ์์ธก์ ์ํด ์ดํ
์
๋ฒกํฐ์ ์ธ์ฝ๋ ์ถ๋ ฅ๋ฒกํฐ๋ฅผ ๊ฒฐํฉ(concatenate)์์ผ ์์ธกํ๋ค.
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
import math, copy, time
from torch.autograd import Variable
import matplotlib.pyplot as plt
import seaborn
seaborn.set_context(context="talk")
%matplotlib inline
Transformer#
ํธ๋์คํฌ๋จธ๋ ์ ๋ฐ์ ์ธ ์ํ์ค ์ ๋ฌ ๋ชจ๋ธ์ ์ธ์ฝ๋์ ๋์ฝ๋๋ฅผ ํฌํจํ๋ ๋ณต์กํ ์ํ(recurrent) ๋๋ ํฉ์ฑ๊ณฑ(convolution)์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค. ์ต๊ณ ์ ์ฑ๋ฅ์ ๋ชจ๋ธ๋ค์ ๋ํ ์ดํ
์
(attention) ์ ํตํด ์ธ์ฝ๋์ ๋์ฝ๋๋ฅผ ์ฐ๊ฒฐํ๋๋ฐ, ์๋ก์ด ๋จ์ํ ๋คํธ์ํฌ ์ํคํ
์ฒ์ธ ํธ๋์คํฌ๋จธ๋ฅผ ์ค๋ก์ง ์ดํ
์
๋ฉ์ปค๋์ฆ
์ ๊ธฐ์ดํ๊ณ , recurrent์ convolution๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค. ๋
ผ๋ฌธ์์๋ 2๊ฐ์ง ๋ฒ์ญ ์์
์คํ์์ ๋ชจ๋ธ์ ๋ณ๋ ฌ์ ์ด๊ณ ๋์์ ํ์ง์ด ์ฐ์ํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์คฌ๋ค.

Positional Encoding#
ํด๋น ๋ชจ๋ธ์์๋ ์ํ(recurrence)์ด๋ ํฉ์ฑ๊ณฑ(convolution)์ ์ ํ ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์, ๋ฐ๋์ ์์น ์ ๋ณด๋ฅผ ๋ฃ์ด์ค์ผ ํ๋ค. ๋ฐ๋ผ์ positional encoding์ ์ฌ์ฉํด์ ์ ๋ ฅ ์๋ฒ ๋ฉ์ ์์น ์ ๋ณด๋ฅผ ๋ฃ์ด์ค๋ค. ๊ฐ ์์น์ ๋ํด์ ์๋ฒ ๋ฉ๊ณผ ๋์ผํ ์ฐจ์์ ๊ฐ์ง๋๋ก ์ธ์ฝ๋ฉ์ ํด์ค ๋ค ๊ทธ ๊ฐ์ ์๋ฒ ๋ฉ๊ฐ๊ณผ ๋ํด์ ์ฌ์ฉํ๋ค.

positional encoding์๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์์ง๋ง ์ฌ๊ธฐ์๋ ์ ๋ ฅ ๋ฌธ์ฅ๊ธธ์ด์ ๋ํ ์ ์ฝ์ฌํญ์ ์ค์ด๋ฆฌ ์ํด sin, cos ํจ์๋ฅผ ์ฌ์ฉํด์ ์ ํํ๋ก ๊ตฌํํด์ ์ฌ์ฉํ๋ค. ๊ฐ ์์น pos์ dimension i์ ๋ํ positional encoding๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ๋ค.
$${PE}{(pos,2i)}=sinโก(pos/10000^{2i/d{model}}) \{PE}{(pos,2i+1)}=cosโก(pos/10000^{2i/{d}{model} })$$
class PositionalEncoding(nn.Module):
"Implement the PE function."
def __init__(self, d_model, dropout, max_len=5000):
super(PositionalEncoding, self).__init__()
self.dropout = nn.Dropout(p=dropout)
# Compute the positional encodings once in log space.
pe = torch.zeros(max_len, d_model)
position = torch.arange(0, max_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2) *
-(math.log(10000.0) / d_model))
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
pe = pe.unsqueeze(0)
self.register_buffer('pe', pe)
def forward(self, x):
x = x + Variable(self.pe[:, :x.size(1)],
requires_grad=False)
return self.dropout(x)
plt.figure(figsize=(15, 5))
pe = PositionalEncoding(20, 0)
y = pe.forward(Variable(torch.zeros(1, 100, 20)))
plt.plot(np.arange(100), y[0, :, 4:8].data.numpy())
plt.legend(["dim %d"%p for p in [4,5,6,7]])
None

Positional Encoding Bert#
์ด์ ๋ฐํด bert์์๋ ์ ๋ ฅ token embedding๊ณผ Position Embeddings, Segment Embeddings, ์ถ๊ฐํด ๊ฐ๊ฐ์ ์๋ฒ ๋ฉ, ์ฆ 3๊ฐ์ ์๋ฒ ๋ฉ์ ํฉ์ฐํ์ฌ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ๋ค. ์ฌ๊ธฐ์ Segment๋ Bert์ ํน์ฑ์ 2๊ฐ์ ๋ฌธ์ฅ์ ์ฌ์ฉํ๋๋ฐ ๊ทธ ๋ฌธ์ฅ์ ๊ตฌ๋ถํ๋ ๋ฒกํฐ์ด๋ค.

Encoder & Decoder#

์ถ๋ ฅ์ ๋ชจ๋ 512์ฐจ์
Encoder#
์ธ์ฝ๋๋ ๋์ผํ ๊ณ์ธต(layer)๊ฐ N๊ฐ ๋ฐ๋ณต๋๋ ํํ์ธ๋ฐ, ์ ๋ ผ๋ฌธ์์๋ 6๋ฒ ๋ฐ๋ณตํ๋ค. Encoder๋ ๊ณ์ธต์ ๋๊ฐ์ ํ์ ๊ณ์ธต(sub-layer)๋ก ๊ตฌ์ฑ๋๋ค. ์ฒซ ํ์ ๊ณ์ธต์ ๋ฉํฐํค๋(multi-head) ์๊ฐ ์ดํ ์ ๋ฉ์ปค๋์ฆ(self-attention mechanism)์ด๊ณ ๋๋ฒ์งธ๋ ๊ฐ๋จํ๊ฒ ์ ๋ณ์๋ ด(point-wise)ํ๋ ์์ ์ฐ๊ฒฐ์ธต(fc-layer)์ด. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ธ ์ ์ฒด์ ์ผ๋ก ๊ฐ ํ์ ๊ณ์ธต์ RC(residual connection)๊ฐ ์ ๋ฌ๋๊ณ , ์ด๋ ์ญ์ ํ๊ฐ ๊ณ์ฐ๋์ด ๊ฒฝ์ฌ ํ๊ฐ์ด ๋ ๋ ์๋ณธ ๊ฐ์ ๋ํํ์ ์ค์ฐจ(Loss)๊ฐ ๊ณ์ฐ๋๋ค. ๊ทธ ํ ๊ณ์ธต ๊ฐ์ ๋ ์ด์ด ์ ๊ทํ(Layer Normalization)ํ๋ค. ์ฆ ๊ฐ ํ์ ๊ณ์ธต์ ๊ฒฐ๊ณผ์ ๋ํด ์์ฐจ ๊ฐ์ ๋ํ๊ณ ๊ทธ ๊ฐ์ ๋ ์ด์ด ์ ๊ทํ ํ ๊ฐ์ด ์ถ๋ ฅ์ผ๋ก ๋์ค๊ฒ ๋๋ค.
Decoder#
๋์ฝ๋๋ ์ธ์ฝ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์ผํ ๊ณ์ธต์ด N๊ฐ ๋ฐ๋ณต๋๋ ํํ์ด๊ณ 6๋ฒ ๋ฐ๋ณตํ๋ค. ๊ทธ๋ฌ๋ ๋ฐ๋ณต๋๋ ๊ณ์ธต์ ์ธ์ฝ๋์๋ ๋ค๋ฅด๊ฒ 3๊ฐ์ ํ์ ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋๋ฐ, 2๊ฐ๋ ๊ธฐ์กด์ ์ธ์ฝ๋์ ํ์ ๊ณ์ธต๊ณผ ๋์ผํ๊ณ ๋๋จธ์ง ํ๋๋ ์ธ์ฝ๋์ ์ถ๋ ฅ์ ๋ํด ๋ฉํฐํค๋ ์ดํ ์ ์ ๊ณ์ฐํ๋ ํ์ ๊ณ์ธต์ด ์ถ๊ฐ๋ฌ๊ณ RC์ ์ ๊ทํ๊ฐ ์ด๋ฃจ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์๊ฐ ์ดํ ์ ์ ์ธ์ฝ๋์๋ ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ๋ง์คํน(masking)์ ์ถ๊ฐํ๋๋ฐ, ์๊ฐ ์ดํ ์ ์ ํ ๋ ํ์ฌ ์์น๋ณด๋ค ๋ค์ ์๋ ๋จ์ด๋ ๋ณํ์ง ๋ชปํ๋๋ก ๋ง์คํน์ ์ถ๊ฐํด์คฌ๋ค. ๋ค๋ฅธ์์น์ ๋จ์ด๋ auto-regressiveํ ํน์ฑ์ ์ด์ฉํด ์๊ณ ์๋ ์ ๋ณด๋ก๋ง ๊ณ์ฐํ๋ค.

class EncoderLayer(nn.Module):
"Encoder is made up of self-attn and feed forward (defined below)"
def __init__(self, size, self_attn, feed_forward, dropout):
super(EncoderLayer, self).__init__()
self.self_attn = self_attn
self.feed_forward = feed_forward
self.sublayer = clones(SublayerConnection(size, dropout), 2)
self.size = size
def forward(self, x, mask):
"Follow Figure 1 (left) for connections."
x = self.sublayer[0](x, lambda x: self.self_attn(x, x, x, mask))
return self.sublayer[1](x, self.feed_forward)
class DecoderLayer(nn.Module):
"Decoder is made of self-attn, src-attn, and feed forward (defined below)"
def __init__(self, size, self_attn, src_attn, feed_forward, dropout):
super(DecoderLayer, self).__init__()
self.size = size
self.self_attn = self_attn
self.src_attn = src_attn
self.feed_forward = feed_forward
self.sublayer = clones(SublayerConnection(size, dropout), 3)
def forward(self, x, memory, src_mask, tgt_mask):
"Follow Figure 1 (right) for connections."
m = memory
x = self.sublayer[0](x, lambda x: self.self_attn(x, x, x, tgt_mask))
x = self.sublayer[1](x, lambda x: self.src_attn(x, m, m, src_mask))
return self.sublayer[2](x, self.feed_forward)
RC(Residual Connection)#
๊ฐ ์ธ์ฝ๋์ ๋์ฝ๋๋ residual connection
residual connection์ ์์์ผ๋ก ๋ํ๋ธ๋ค๋ฉด
$y_l=h(x_l)+F(x_l,W_l )$
์ฌ๊ธฐ์ $f(y_l)$๋ ${x}_{l+1}$์ ํญ๋ฑํจ์๊ณ $h(x_l )$๋ $x_l$ ๋ก ๋งตํ๋๋ค.
์ด ๋, $x_{(l+1)}$ โก $y_l$ ๋ผ๊ณ ํ๋ค๋ฉด,
$x_{(l+1)}=x_l+F(x_l,W_l )$ ์ด๊ณ
์ฌ๊ท์ ์ผ๋ก $(x_{(l+2)}=x_{(l+1)}+F(x_{(l+1)},W_{(l+1)}) =x_l+ F(x_l, W_l)+F(x_{(l+1)},W_{(l+1)}), etc.).$
$$x_L=x_l+\sum\limits^{L-1}{i=1}F(x_i,W_i)$$ ์ด ์์ ๋ฏธ๋ถํ๋ฉด $\frac{โฮต}{โx_l}=\frac{โฮต}{โx_L} \frac{โx_L}{โx_l} = \frac{โฮต}{โx_L} (1+\frac{โ}{โx_l} \sum\limits^{L-1}{i=1} F(x_i,W_i))$
์ฌ๊ธฐ์ $\frac{โฮต}{โx_L}$ ๋ ๋ชจ๋ ๋ ์ด์ด์ ์ ์ฉ ๋๊ณ , F๊ฐ 0์ด ๋๋ ๊ฒฝ์ฐ๋ ํฌ๋ฐํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ค์น $ฮต$ ๊ฐ ๋งค์ฐ ์๋๋ผ๋ Vanishing Gradient
๋๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์๋ค.
class SublayerConnection(nn.Module):
"""
A residual connection followed by a layer norm.
Note for code simplicity the norm is first as opposed to last.
"""
def __init__(self, size, dropout):
super(SublayerConnection, self).__init__()
self.norm = LayerNorm(size)
self.dropout = nn.Dropout(dropout)
def forward(self, x, sublayer):
"Apply residual connection to any sublayer with the same size."
return x + self.dropout(sublayer(self.norm(x)))
Scaled Dot-Product Attention#

ํด๋น ์ดํ ์ ์ ์ ๋ ฅ์ 3๊ฐ์ง์ด๋ค. D๊ฐ ์ฐจ์์ ๊ฐ์ง๋ queries(Q)์ keys(K), values(V)๋ก ๊ตฌ์ฑ๋๋ค. ๋จผ์ Q๋ ์ฃผ๋ก ๋์ฝ๋์ ์๋ ์ํ ๋ฒกํฐ, K๋ ์ธ์ฝ๋์ ์๋ ์ํ ๋ฒกํฐ, V๋ K์ ์ ๋ ฌ ๋ชจ๋ธ(alignment model)๋ก ๊ณ์ฐ๋ ์ดํ ์ ๊ฐ์ค์น์ด๋ค.
Query: query๋ ๋ค๋ฅธ ๋ชจ๋ ๋จ์ด์ ๋ํด ์ ์๋ฅผ ๋งค๊ธฐ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํ์ฌ ๋จ์ด์ ํํ์ด๋ค(ํค ์ฌ์ฉ). ์ฐ๋ฆฌ๋ ํ์ฌ ์งํ์ค์ธ ํ๋ก์ธ์ค ํ ํฐ์ ์ง์์๋ง ์ ๊ฒฝ์ ์ด๋ค.
Key: key ๋ฒกํฐ๋ ์ธ๊ทธ๋จผํธ์ ์๋ ๋ชจ๋ ๋จ์ด์ ๋ํ ๋ผ๋ฒจ๊ณผ ๊ฐ๋ค. ๊ด๋ จ๋ ๋จ์ด๋ค์ ์ฐพ์ ๋ ๋งค์นญ๋๋ค.
Value: value ๋ฒกํฐ๋ ์ค์ ๋จ์ด ํํ์ด๋ค. ๊ฐ ๋จ์ด๊ฐ ์ผ๋ง๋ ๊ด๋ จ์ด ์๋์ง ๊ณ์ฐ๋์์ ๋, value๋ฅผ ์ด์ฉํด์ ํ์ฌ ๋จ์ด์ ๊ฐ์ค์น๋ฅผ ๊ณ์ฐํ๋ค.
๋น์ ๋ฅผ ํ์๋ฉด, query๋ ์ฐ๊ตฌํ๊ณ ์๋ ์ฃผ์ ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ฉ๋ชจ๋ผ๊ณ ํ๋ค๋ฉด, key๋ ์บ๋น๋ ์์ ์๋ ํด๋์ ํ๊ทธ๋ผ๊ณ ํ ๋,
ํ๊ทธ๋ฅผ ์คํฐ์ปค ๋ฉ๋ชจ์ ์ผ์น์ํค๋ฉด, ํด๋์ ๋ด์ฉ์ value. ์ด ๋, ํ๋์ ๊ฐ๋ง ์ฐพ๋ ๊ฒ์ด ์๋๋ผ ํด๋์ ํผํฉ๋ ๊ฐ์ ์กฐํฉ์ ์ฐพ์ ํ query ๋ฒกํฐ์ ๊ฐ ํค vector๋ฅผ ๊ณฑํ ๊ฐ์ด ๊ฐ ํด๋์ ์ ์์ด๋ค.
์ฆ, ํ๋์ query์ ๋ํด ๋ชจ๋ key๋ค๊ณผ ๋ด์ ์ ํ ๋ค ๊ฐ ๊ฐ์ k์ ์ฐจ์์์ธ $\sqrt{d}_{k}$๋ก ๋๋ ์ฃผ๋ฉด์ ์ค์ผ์ผ๋งํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ํํธ๋งฅ์ค ํจ์๋ฅผ ์์ด ํ ๋ง์ง๋ง์ผ๋ก ๊ฐ์ ๊ณฑํฉ๋ค.
$\ Attension(Q, K, V)=softmax(\frac{(QK^T)}{โ(d_k)})V$

Multi-Head Attention#

Query, key, value ๋ค์ ๊ฐ๊ฐ ๋ค๋ฅธ ํ์ต๋ ์ ํ ํฌ์(linear projection)์ h๋ฒ ์ํํ๋ค. ์ฆ, ๋์ผํ Q,K,V์ ๊ฐ๊ฐ ๋ค๋ฅธ weight matrix W๋ฅผ ๊ณฑํฉ๋๋ค. ๊ทธ ํ ๊ฐ๊ฐ ์ดํ ์ ์ ๋ณํฉ(concatenate)ํ๋ค.
$$MultiHead(Q,K,V)=Concat(head_1,โฆ,head_h)W^o \ where head_i=Attention(QW_i^Q,KW_i^K,VW_i^V) $$
์ดํ ์ ๋ ์ด์ด๊ฐ h๊ฐ ์ฉ์ผ๋ก ๋๋ ์ง์ ๋ฐ๋ผ ๋ชจ๋ธ์ ์ฌ๋ฌ ๊ฐ์ ํํ ๊ณต๊ฐ(representation subspaces)๋ค์ ๊ฐ์ง๊ฒ ํด์ฃผ๋๋ฐ, Query, key, Value weight ํ๋ ฌ๋ค์ ํ์ต์ด ๋ ํ ๊ฐ๊ฐ์ ์ ๋ ฅ๋ฒกํฐ๋ค์๊ฒ ๊ณฑํด์ ธ ๋ฒกํฐ๋ค์๋จ์ด์ ์ ๋ณด์ ๋ง์ถ์ด ํฌ์์ํค๊ฒ ๋๋ค.

Position-wise Feed-Forward Networks#
์ดํ ์ ํ์ ๊ณ์ธต์์ fully connected feed-forward network๋ก ์งํํ๋ ๊ณผ์ ์ด๊ณ ๋๊ฐ์ ์ ํ ํ๊ท์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
$\ FFN(x)=maxโก(0,xW1+b1)W2+b2FFN(x)=maxโก(0,xW1+b1)W2+b2$
๋ ๋ ์ด์ด ์ฌ์ด์ Trasformer๋ ReLU ํจ์๋ฅผ Bert๋ erf off GELU๋ฅผ ์ฌ์ฉํ๋ค.

def gelu(x):
cdf = 0.5 * (1.0 + torch.erf(x / np.sqrt(2.0)))
return x * cdf
Why Self-Attention#
์ ๋ ผ๋ฌธ์์๋ ์ด ๋ชจ๋ธ์์ ์ํ๋ ํฉ์ฑ๊ณฑ์ ์ฌ์ฉํ์ง ์๊ณ ์๊ฐ ์ดํ ์ (self-attention)๋ง์ ์ฌ์ฉํ ์ด์ ์ ๋ํด์ ์์๋ณด๋ฉด, 3๊ฐ์ง ์ด์ ๋ก ์๊ฐ ์ดํ ์ ์ ์ ํํ๋ค
๋ ์ด์ด๋น ์ ์ฒด ์ฐ์ฐ๋์ด ์ค์ด๋ ๋ค(์๊ฐ๋ณต์ก๋).
๋ณ๋ ฌํ๊ฐ ๊ฐ๋ฅํ ์ฐ์ฐ๋์ด ๋์ด๋๋ค.
๊ฑฐ๋ฆฌ๊ฐ ๋จผ ๋จ์ด๋ค์ ์ข ์์ฑ(long-range ๋๋ long-term dependency)๋๋ฌธ
๊ทธ๋ฆฌ๊ณ ์์ 3๊ฐ์ง ์ธ์ ๋ ๋ค๋ฅธ ์ด์ ๋ ์ดํ ์ ์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ธ ์์ฒด์ ๋์์ ํด์ํ๊ธฐ ์ฌ์์ง๋ค(interpretable). ์ดํ ์ ํ๋์ ๋์ ๋ฟ๋ง ์๋๋ผ multi-head์ ๋์ ๋ํ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํดํ๊ธฐ ์ฝ๋ค๋ ์ฅ์ ์ด ์๋ค.

reference#
โขTransformer
โขBert
โขAttention
โขResidual Connection
โขLayer Normalization
โขLabel Smoothing
โขThe Illustrated Transformer
โขThe Illustrated GPT-2 (Visualizing Transformer Language Models)
โขhttps://pozalabs.github.io/transformer/
โขhttp://freesearch.pe.kr/archives/4876#easy-footnote-bottom-2-4876
โขhttps://wikidocs.net/22893
โขhttp://docs.likejazz.com/bert/
BERT extention#
Bidirectional#
์ ์๋ unidirectional์ token-level์์ ๋จ์ ์ด ๋๋ค๊ณ ํ๋ค. GPT ๊ฐ์ unidirectional ํ ๋ชจ๋ธ, ์ฆ ๋ชจ๋ ํ ํฐ์ ์ด์ ํ ํฐ๋ง ์ฐธ๊ณ ํ ์ ์๋ auto-regressive ๋ชจ๋ธ๊ณผ๋ ๋ฌ๋ฆฌ BERT์ ๊ฒฝ์ฐ ์ด์ ๊ณผ ์ดํ์ ์ ๋ณด๋ฅผ ๋ชจ๋ ํ์ฉํ๋ค. ๊ณ์ฐ๋๋ ๋ฌผ๋ก 2๋ฐฐ.
Masked Language Model#
์ ๋ฌธ์ฅ์ ๋ค์ ๋จ์ด๋ฅผ ์์ธกํ๋ ๊ฒ์ด ์๋๋ผ ๋ฌธ์ฅ๋ด ๋๋คํ ๋จ์ด๋ฅผ ๋ง์คํนํ๊ณ ์ด๋ฅผ ์์ธกํ๋๋ก ํ๋ ๋ฐฉ์์ผ๋ก Word2Vec์ CBOW ๋ชจ๋ธ๊ณผ ์ ์ฌํ๋ค. ํ์ง๋ง MLM์ Context ํ ํฐ์ Center ํ ํฐ์ด ๋๋๋ก ํ์ตํ๊ณ Weights๋ฅผ ๋ฒกํฐ๋ก ๊ฐ๋ CBOW์ ๋ฌ๋ฆฌ, ๋ง์คํน๋ ํ ํฐ์ ๋ง์ถ๋๋ก ํ์ตํ ๊ฒฐ๊ณผ๋ฅผ ์ง์ ๋ฒกํฐ๋ก ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ณด๋ค ์ง๊ด์ ์ธ ๋ฐฉ์์ผ๋ก ๋ณผ ์ ์๋ค. ๋ง์คํน์ ์ ์ฒด ๋จ์ด์ 15% ์ ๋๋ง ์งํํ๋ฉฐ, ๊ทธ ์ค์์๋ ๋ชจ๋ ํ ํฐ์ ๋ง์คํน ํ๋๊ฒ ์๋๋ผ 80% ์ ๋๋ง
Next Sentence Prediction(NSP)#
Bert๋ 2๋ฌธ์ฅ์ ์
๋ ฅ์ผ๋ก ๋ฃ์ ๋, [cls] ๋ฌธ์ฅ [sep] ๋ฌธ์ฅ
ํ์์ ์
๋ ฅ์ผ๋ก ์ฌ์ฉํ๋ค. ์์ ์ no NSP๋ผ๋ฉด Accuracy๊ฐ 0.5์ ๋ ๋จ์ด์ง๋ค๊ณ ํ๋๋ฐ, ๋ฐ๋ก ์ ํผ์น๋ ๋
ผ๋ฌธ๋ ๋ง์ผ๋ฏ๋ก ๋์ด๊ฐ๋ค.
Effect of Model Size#
Bert Base์ ๋ชจ๋ธ์ L=12, H=768, A=12 110M parameter
Large ๋ชจ๋ธ์ L=24, H=1024, A,16 340M parameter
๋ค๋ฅธ bi-LSTM(context2vec) ๊ฐ์ ๊ฒฝ์ฐ ํ๋ ๋ฒกํฐ์ ์ฐจ์์๋ฅผ 200์์ 600๊น์ง ์ฌ๋ฆฌ๋๊ฒ์ ์ ์๋ฏธํ์ง๋ง 1000๊น์ง ์ฌ๋ฆฌ๋ ๊ฒ์ ๋์์ด ๋์ง ์์๋ค.
๋ฐ๋ฉด transformer๋ ๋์ฉ๋ ๋ชจ๋ธ์ ํ์ต์ ๊ฐ๋ฅ์ผ ํ๋ค.