본문 바로가기
경제학코딩 2023

[Keras Layer - (2)]

by 개발도사(진) 2023. 12. 16.

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