티스토리 뷰

Transformer를 이용해 protein sequence를 source로, Drug SMILES sequecne를 target으로 사용하는 모델을 만들고 있다.

더보기

 

Transformer input은 보통 RNN과 다르게 단어의 토큰 시퀀스를 하나씩 순차적으로 전달하지 않고, 문장 하나를 뭉탱이로 Encoder나 decoder로 전달하기 때문에 컴퓨터는 로직상 RNN처럼 순차적으로 전달될때와 다르게 문장이 어떤 순서로 작성되어있는지 이해할 수 없다.

예를 들어보자, "나는 찰옥수수가 들어간 밥을 먹기로 엄마와 약속했다." 라는 문장이 있을 때 이 문장을 RNN으로 전달하면 ['나', '는', '찰옥수수', '가', '들어', '간', '밥', '을', '먹기', '로', '엄마', '와', '약속', '했다'] 등의 토큰 순서대로 모델에 전달된다.

따라서 모델은 그 전달 순서 자체로 이미 각 토큰들의 문장 내에서의 순서 정보를 알고 있는 것이고, 이것은 문장 해석에 큰 도움이 되는 정보가 된다.

그런데 Transformer의 문장 토큰 전달방식은 이와는 달리 ["나는 찰옥수수가 들어간 밥을 먹기로 엄마와 약속했다."] 라는 문장 자체를 전달한다. 

우리가 보기에는 그게 무슨말이냐? 그럼 똑같은 문장이 전달되는게 아니냐? 라고 생각할 수 있지만, 우리의 뇌는 하나의 뭉탱이로 작성된 문장을 항상 잘게 나눠진 시퀀스로 인식하여 왼쪽으로부터 오른쪽으로 하나씩 순서대로 전달받는다.

문장을 읽을 때 ["밥을 엄마와 먹기로 찰옥수수가 들어간 약속했다 나는"]과 같이 읽은 사람은 없을것이다. 즉, 우리의 뇌는 RNN이 문장을 입력받는 방식처럼 모든 단어를 토큰화하여 하나씩 순서정보를 토대로 이해하는 것에 기반으로 하기 때문에 이미 문장 자체를 입력받는 순간에 RNN처럼 토큰화 한뒤, 순서정보를 갖는 토큰들을 순서대로 입력받는 작업을 통해 문장 해석을 진행한 것이다.

반면 컴퓨터는 문장 성분을 인간의 두뇌처럼 이해하는 것이 아니라 그냥 입력되는 벡터 자체를 보는 것이기 때문에 문장 자체를 벡터화한 input을 사용하게되면 그냥 문장 하나 자체의 의미를 이해하는 것이다.

컴퓨터가 문장을 전달받을때 순서정보를 잃게 된다는게 무슨말인지 직관적으로 와닿지는 않겠지만, 실제로 컴퓨터에게 문장을 전달하는것과 토큰을 순서대로 하나씩 전달하는 것은 완전히 다른 입력방식인 것이라고 이해하자.

서론이 길어졌는데 결국 하고자 하는 말은 Transformer 모델은 이렇게 문장을 input하므로 잃어버린 토큰들의 위치정보를 보완하기위해서 Positional Encoding이라는 방식을 이용해 문장 토큰들의 위치정보를 추가해준다는 것이다.

여기서 나는 생각했다. 

Protein, SMILES sequence에는 그 자체로 이미 중요한 정보를 담고 있을텐데, 1D CNN을 통해서 중요 정보를 담고있는 FeatureMap을 extract한 뒤, transformer가 잃어버린 postional information을 추가하기 위해 Positional Encoding을 하는 것 처럼 Position 정보보다 한단계 고차원적인 FeatureMap information을 Encoding 하는것도 도움이 되지 않을까?

 

따라서 나는 Transformer에 Postional Encoding 하는 것 뿐 아니라, 1D CNN을 통해 Extract한 feature map을 한번 더 encoding 해주는 FeatureMap Encoding을 생각해보기로 했다.

예전에 얼핏 1x1 Convolution이 input shape를 바꾸지 않으면서 parameter를 줄여주는 역할을 한다고 들었던 기억을 바탕으로 일단 1x1 Conv를 진행해볼까? 하여 1x1 Convolution 연산에 대해 공부를 하기로 해봤다.

 

 

 

1. 1 x 1 Convolution

: 그야말로 1x1 kernel을 이용해서 convolution 연산을 진행하는 것이다.

28x28x4 image를 1x1 Conv연산한 결과

나의 미술적 감각의 한계로 인해 그림에서는 kernel의 channel이 1개인 것처럼 그려놓았지만, 사실은 1 x 1 size의 커널이 4개, 즉 channel=4인 것을 유의하자. 다시말해 kernel의 채널수는 반드시 input data의 채널수와 맞춰준다.

채널이 4개라는말이 이해가 안가면 이 글부터 읽어보아 컨볼루션 연산의 개념을 잡는게 좋아 보인다.

https://wikidocs.net/62306

 

07-01 합성곱과 풀링(Convolution and Pooling)

합성곱 신경망(Convolutional Neural Network)은 이미지 처리에 탁월한 성능을 보이는 신경망입니다. 이번 챕터에서는 합성곱 신경망에 대해서 학습합니다. …

wikidocs.net

 

2. 효과

: 이렇게 1x1 Convolution을 진행하면 28x28x4였던 image의 size가 28x28x1로 상당히 축소된다.

이것은 이후에 Neural Net을 거치면서 생성되는 parameter들의 수를 상당부분 줄여주는 역할을 한다.

따라서 3채널보다 큰 비디오 데이터나 RGB 이외의 어떤 추가적인 채널의 데이터를 포함하고있는 데이터를 처리할 때, 기하급수적으로 커지는 parameter number를 줄이기 위해 약간의 데이터 손실을 감수하더라도 1x1 Convolution을 진행하는 경우가 있다.

댓글