Open givitallugot opened 9 months ago
assign roles -s 0304 -c 1 2 3
0 | 1 | 2 | |
---|---|---|---|
member | 주선미 | 한단비 | 김유리 |
chapter | 1 | 2 | 3 |
assign roles -s 0304 -c 1 2 3
0 | 1 | 2 | |
---|---|---|---|
member | 주선미 | 한단비 | 김유리 |
chapter | 1 | 2 | 3 |
A woman is throwing a frisbee in a park
캡션 내 디코더가 frisbee 출력시 입력 이미지 내 초점을 맞춘 부분RNN의 단기 기억의 제한성에 훨씬 적은 영향을 받음
각 타임 스텝에서 적절한 단어에 디코더가 초점을 맞추도록 하는 기술
인코더의 마지막 은닉 상태만 디코더에 보내는 것이 아니라 인코더의 모든 출력을 디코더로 전송
이 단계에서 주의를 집중할 단어를 결정 -> 그 가중치가 a(t,i): t번째 디코더 타임 스텝에서 i번째 인코더 출력의 가중치
이러한 a(t,i) 가중치는 정렬모델(어텐션)이라고 부르는 작은 신경망에 의해 생성
그림의 오른쪽이 바로 어텐션 모델. TimeDistributed 클래스를 적용한 Dense 층으로 시작
이 TimeDistributed 층은 하나의 뉴런으로 구성되고 인코더의 모든 출력을 입력으로 받아 디코더의 이전 은닉 상태 (ex h(2))를 연결
그리고 이 TimeDistributed 층은 각 인코더 출력 에 대한 점수를 출력함 (ex e(3,2) 이는 각 출력이 디코더의 은닉 상태와 얼마나 잘 맞는지를 측정
마지막으로 모든 점수가 softmax 층을 통과해서 각 인코더 출력에 대한 최종 가중치를 얻음.
이런 어텐션을 바흐다나우 어텐션 또는 연결 어텐션이라고 부름
루옹 어텐션 또는 곱셈 어텐션도 존재
어텐션 메커니즘의 목적은 인코더의 출력 하나와 디코더의 이전 은닉 상태 사이의 유사도를 측정하는 것이므로 두 벡터 사이의 점곱을 제안
최근에는 연결 어텐션보다 더 높은 성능이 나오는 점곱을 사용한 어텐션을 많이 사용
class PositionalEncoding(keras.layers.Layer):
def __init__(self, max_steps, max_dims, dtype=tf.float32, **kwargs):
super().__init__()
if max_dims % 2 == 1: max_dims += 1
p, i = np.meshgrid(np.arange(max_steps), np.arange(max_dims // 2))
pos_emb = np.empty((1, max_steps, max_dims))
pos_emb[0, :, ::2], = np.sin(p / 10000**(2*i/max_dims)).T
pos_emb[0, :, 1::2] = np.cos(p / 10000**(2*i/max_dims)).T
self.positional_embedding = tf.constant(pos_emb.astype(self.dtype))
def call(self, inputs):
shape = tf.shape(inputs)
return inputs + self.positional_embedding[:, :shape[-2], :shape[-1]]
2024/03/17 (일) 10:00
1: 16.4 2: 16.4.1 3: 16.4.2 ~ (위치 인코딩까지)