LayerNormalization
Keras.layers.LayerNormalization을 이용해서 layer normalization을 수행한다. 이 과정은 dense layer를 통과한 각 data(sample)을 평균 0, 표준편차 1이 되도록 가공한다.
이 과정이 반드시 필요하다고 할 수는 없으나, data의 값들이 너무 커지거나 작아지면 gradient 연산에 방해되므로, 최적화를 위해 필요한 과정이라고 할 수 있다.
layer normalization을 위해, 먼저 keras.layers.LayerNormalization 객체를 만든다.
layernorm = keras.layers.LayerNormalization()
앞선 포스팅에서 언급한 embedding layer, dense layer를 만들고, 원본 data가 두 레이어를 통과하게 한 후에 그 값을 layer normalization 시킬 것이다.
emb = keras.layers.Embedding(100, 512)
linear = keras.layers.Dense(5)
x = np.random.randint(0, 100, (2, 10))
x_emb = emb(x)
x_lin = linear(x_emb)
10개의 단어(여기서는 랜덤한 숫자)로 만들어진 2개의 문장 x가 있다고 하자. 이를 input_dim = 100, output_dim = 512인 embedding layer에 통과시키면 2개의 문장, 10개의 단어, 각 단어가 512개 compnent 를 갖는 vector로 변환된 값을 얻게 된다.
다시 이 값을 dense layer에 통과시켜서 각 512개 component가 5개의 output 값이 되게 했다. 여기까지 수행한 결과물은 아래와 같다.
이 값을 layer normalization하면, 각 sample(여기서는 한 줄)이 평균 0, 표준편차 1이 되도록 변환된다. 이를 수행하는 코드와 그 결과값은 아래와 같다.
layernorm(x_lin)
Add Layer
Merge Layer 중 하나로, 말 그대로 '더하기'를 해 주는 layer이다. 단, shape이 같아야만 사용할 수 있다.
add = keras.layers.Add()
위와 같이 keras.layers.Add 객체를 만들고, 앞서 다뤘던 x_emb(embedding layer를 통과한 값), x_lin(dense layer를 통과한 값), x_norm(layer normalization을 수행한 값)을 준비한다.
layer normalization은 data의 shape을 바꾸지 않기 때문에 x_lin, x_norm의 shape은 모두 같다. 따라서 여기에 Add Layer를 적용할 수 있다.
add([x_lin, x_norm])
Dropout Layer
dropout은 overfitting을 피하기 위해 임의의 input을 0으로 바꾸고, 다른 값에는 1/(1-rate)의 변형을 가해서 전체 sum을 같게 유지시키는 방법이다.
dropout = keras.layers.Dropout(0.2)
위 코드는 Dropout instance를 만드는 코드이며, parameter로 주어진 값은 0으로 바꿀 input의 percentage를 의미한다.
위 값은 x_lin 값이다. 이 값에 다음 코드를 사용해서 dropout을 취하면
dropout(x_lin, training=True)
이처럼 몇 개의 input 값들이 0으로 변하고, 다른 값들도 조금씩 수정되었음을 확인할 수 있다.
Feed-Forward Network
위 이미지의 체크된 부분에 해당하는 부분으로, 딥러닝에서의 feed forward란 입력을 1개 이상 layer를 거쳐서 다시 출력값으로 내보내는 과정을 의미한다.
keras.layers.Layer를 상속받아 linear regression->linner rigeression->dropout->add->layer normalization을 거치는 feed forward Class는 다음과 같이 작성할 수 있다.
class ffn(keras.layers.Layer):
def __init__(self):
super().__init__()
self.linear1 = keras.layers.Dense(2024, activation="relu")
self.linear2 = keras.layers.Dense(512)
self.dropout = keras.layers.Dropout(0.1)
self.add = keras.layers.Add()
self.layernorm = keras.layers.LayerNormalization()
def call(self, inputs):
x = self.linear1(inputs)
x = self.linear2(x)
x = self.dropout(x)
x = self.add([inputs, x])
return self.layernorm(x)
'경제학코딩 2023' 카테고리의 다른 글
[Encoder Only Model with imdb] (0) | 2023.12.17 |
---|---|
[Encoder Only Model with Random Data] (1) | 2023.12.17 |
[Keras Layer-(1)] (0) | 2023.12.16 |
[torch.nn-(2)] (1) | 2023.12.15 |
[torch.nn - (1)] (0) | 2023.12.14 |