text data를 다루는 NLP + computer vision과의 활용 - image captioning 기본 배우기1

1. multi-modal learning

 

서로 다른 타입의 데이터를 같이 활용하는 학습 방법

 

이미지와 텍스트나 사운드를 같이 활용해서 학습할 수 있을까?

 

데이터라 하면 사람의 오감에서 얻는 정보나 social perception으로 불리는 사회적 감각에 의한 정보..(눈치)

 

3d sensor에서 얻은 정보나..

 

 

 

예를 들어 text 하나의 데이터만 다루는 형태는 unimodal

 

이미지와 audio를 같이 활용한 학습이라면 multimodal 형태

 

 

2. multi-modal learning은 왜 어려운가

 

지금까지 배운 방식으로 image데이터라면 CNN에 넣어서 학습하고 text라면 RNN에 넣어서 학습해서 합치면 그만 아닌가?

 

일단 데이터마다 컴퓨터가 이해할 수 있도록 표현하는 방식이 다르다.

 

1) 소리는 시간축에 따라, 마이크의 판막의 떨림을 전기신호로 전환해서 그 크기를 1D vector로 늘여놓은 wave form

 

2) 이미지는 2d-array의 격자 내에 color 값을 0~255 사이 숫자로 넣은 형태

 

3) text는 각 단어별로 고유의 vector로 encoding된 형태

 

 

 

또 하나로 어려운 점은 서로 다른 데이터간 가지고 있는 정보량의 비대칭성

 

"아보카도 모양의 의자"라는 한줄의 텍스트는 만족하는 형태의 수많은 다양한 이미지와 대응될 수 있다

 

 

 

당연하지만 반대로 이미지 하나를 주고 해당 이미지에 대해 텍스트로 표현해보라 하면, 다양한 표현이 가능할 것이다

 

그래서 이런 다양한 가능성을 전부 고려하는 모델링이 상당히 어렵다

 

또한 이미지에서 표현하기 쉬운 내용이 텍스트로는 표현하기 어려울 수도 있을 것

 

multi-modal learning이 상당히 어려운 부분이 있지만, 서로 다른 데이터간의 특징을 잘 활용한다면 좋은 시너지를 낼 수 있을 것

 

 

3. word-level text embedding

 

컴퓨터는 어차피 글자 그대로는 이해 못하니까.. text의 기본인 character 단위로 각각을 아스키코드로 나타내서

 

전체 text를 아스키코드의 열로 표현하는 embedding 방법도 한가지 방법일 것

 

하지만 그렇게 사용하면 컴퓨터 입장에선 각 단어가 가지는 의미를 파악하기가 쉽지 않다

 

예를 들어 cat에 사용된 a와 man에 사용된 a는 느낌 자체가 다를텐데 전부 a의 아스키코드 97로 표현한다면..

 

컴퓨터는 그런 느낌 자체를 파악하지 못해

 

그래서 character 단위로 표현하기에는 정보를 나타내는데 비효율적이다

 

이것의 대안으로 word level의 embedding을 많이 활용한다

 

 

 

 

각 단어는 위와 같이 dense vector로 embedding되는데..

 

매우 고차원의 의미적인 vector space에 위치 정보를 이용해 해당 단어를 mapping시켜 표현

 

위 예시로 각 차원마다 사람이냐 성별이냐 복수냐 동사냐.. 등의 뜻이 있다고 나와있지만 실제로 각 차원이 해석가능하지는 않다.

 

아무튼 각 dimension이 단어의 특성을 나타내는 정보들이 녹아 vector space의 고유한 위치가 결정된다라고 생각하면 될 것같다.

 

vector의 embedding은 단어의 의미를 벡터로 녹여넣어 표현하는 것이다.

 

 

어떻게 잘 embedding시켜서 vector를 구하여 저차원에 눈으로 보기 좋게 실제 표현을 해보니

 

cat과 kitten은 고양이를 나타내는 뜻이 비슷한 단어인데 이들이 비슷한 위치에 존재하며..

 

이들과 뜻이 다른 dog, house는 먼 위치에 존재한다.

 

또한 dog와 cat,kitten은 동물로 비슷한 종이니 상대적으로 전혀 관련없는 house와 거리가 멀다는 것도 보여진다.

 

또한 man과 woman vector를 빼서 얻은 벡터를.. king이라는 vector에 더해주면 queen이 나온다

 

남자와 여자 사이 의미관계를 king에 더해줬더니 queen이 나온다는 뜻

 

이는 굉장히 높은 일반화 능력을 가진다는 뜻이다

 

이는 의도하고 디자인된 것은 아니고 text embedding을 잘 학습시키다 보니 자연스럽게 나온 결과이다

 

 

4. Word2Vec

 

word embedding을 구하는 대표적인 학습 모델

 

Word2Vec의 한 종류인 skip gram

 

 

학습하고자 하는 weight인 W가 하나 있고 3종류의 다른 W'이 존재

 

입력단어에 대하여, 문장에서 입력단어 주변에 나올것같은 단어를 예측하는 형태로 학습

 

drink를 넣으면 drink가 어떤 문장 내에서 주변에 어떤 단어가 나올지 예측하는 형태

 

man, apple, juice가 나오는...

 

입력단어는 one hot vector의 형태로 들어간다

 

그림을 보면 input layer에 V-dim vector가 들어간다는데 V개의 단어를 표현하고 싶은 것이다

 

표현할 수 있는 단어 집합이 V개

 

drink가 두번째 차원에 해당한다면.. [0,1,0,0,0]으로 drink를 표현하는 것이 one hot vector

 

이렇게 넣어주면 W와 연산을 할때 어떤 형태가 일어날까?

 

W의 2번째 행을 제외하고 나머지는 0으로 지워질 것이다

 

 

그러면 이 말은 학습이 완료되면 각 단어에 대응하는 차원과 대응하는 W의 각 행이.. 해당 단어의 embedding vector로 학습될 수 있다는 뜻이다.

 

drink에 대응하는 embedding vector는 W의 2번째 행벡터가 된다는 뜻

 

그리고 첫번째 W'은 예를 들어 drink의 앞에 나오는 단어들을 예측하는 layer

 

두번째 W'은 drink의 바로 뒤에 나오는 단어들을 예측하는 layer,

 

세번째 W'은 drink의 바로 다음다음에 나오는 단어들을 예측하는 layer로 볼 수 있을 것

 

그리고 학습이 끝나면 사용하는 Word2vec는 W행렬의 각 벡터가 된다

 

 

 

주변 단어를 예측한다는 말이 무슨 말인지 구체적으로 위와 같은 예시를 들었다

 

가운데 단어(파란색)가 input이고 window size를 5라고 정의하면 가운데 단어 주변 총 5개가 하나의 window

 

예를 들어 3번째 brown을 보면..

 

brown을 넣으면 the가 나오고

 

brown을 넣으면 quick가 나오고

 

brown을 넣으면 fox가 나오고

 

brown을 넣으면 jumps가 나오도록 학습을 시킨다

 

주어진 단어에 대해 N개의 이웃 단어를 예측하도록 학습하는 모델이 skip-gram이며 단어간 관계성을 학습하도록 한다

 

어떤 label된 데이터 없이 그냥 문장 하나로 쉽게 데이터를 만들어 학습할 수 있는 unsupervised learning의 일종

 

단어간 관계성을 학습하면서.. cat, kitten같이 의미적 공간을 자연스럽게 익힌다

 

그리고 일반화를 시키는 (man - woman, king - queen) analogy 관계도 자연스럽게 학습된다

 

 

5. image-tagging

 

image도 convolution을 통해 중간에 어떤 feature vector로 표현가능

 

그러면 text는 embedding vector로 표현할 수 있다는 것을 위에서 배움

 

vector간 유사도 계산을 이용해...

 

 image가 주어지면 image와 연관된 text embedding을 찾도록 만들 수 있다

 

반대로 word가 주어지면 word와 연관된 image를 찾을 수 있도록 학습 가능

 

image embedding과 text embedding이 호환되도록 joint embedding을 학습하도록 구현한다면 image-tagging을 만들 수 있다.

 

 

어떻게 할 수 있을까?

 

미리 학습된 word, image 각 unimodal model을 합성시킨다

 

 

 

text를 잘 학습한 word2vec에서 word를 받아 feature vector를 뽑고

 

image를 잘 학습한 CNN에서 image를 받아 image vector를 뽑아

 

여기는 각각 따로 학습한 unimodal model을 사용한것

 

그래서 word embedding과 image embedding 사이에는 아직 호환성이 없다

 

그래서 호환성이 있도록 만들기 위해 fully connected layer로 transform 시켜가면서 서로 호환되도록 변형시킨다

 

그러면서 두 embedding vector가 의미적으로 비교 가능하도록 학습하는 형태를 joint embedding이라고 부른다

 

 

image와 대응하는 단어의 pair가 미리 주어진 supervised learning 형태

 

word embedding을 fully connected layer로 변형시켜 공통된 공간에 올리고

 

image embedding도 fully connected layer로 변형시켜 공통된 공간에 올린다

 

공통된 vector space에 올라오니 당연히 두 vector의 dimension을 일치

 

따라서 두 vector간 distance 고려가 가능

 

학습 방법은 대응하는 단어와 이미지는 서로 가까이 있도록

 

그리고 이미지와 상관없이 랜덤한 단어 아무거나 뽑아서 만든 pair는 서로 멀리가도록한다면..

 

의미가 통하는 이미지와 단어는 가까이 있고 관련없는 이미지와 단어는 멀리 있을 것

 

따라서 텍스트가 주어지면 해당하는 이미지를 찾게 되고..

 

이미지가 주어지면 비슷한 의미를 가지는 텍스트를 검색할 수 있게 된다

 

이런 거리 관계로 학습하는 방법을 metric learning이라고 부름

 

 

의도한건 아니지만 word2vec에서 보인 analogy관계가 image-word에서도 보여지더라

 

개 이미지 vector에 dog word vector를 빼고 cat word vector를 더해주면 어떤 vector가 나오는데..

 

이 vector와 image vector간 유사도 계산을 해서 검색을 해보면 고양이 이미지들이 나온다

 

근데 여기서 더 재밌는건

 

 

 

 

강아지 사진 주변에 잔디가 있는데.. 첫번째로 검색된 고양이 사진 주변에도 잔디가 있더라

 

강아지 사진에서 강아지만 정확히? 빼버렸다는거지

 

의도하지 않았는데도 일반화 가능한 analogy 관계를 image - word간에도 학습을 잘 한다

 

 

 

word embedding을 넘어 문장, 문단 단위로도 embedding을 만들 수 있다

 

구성하는 word 더하면 될걸?

 

그러면 image와 단순한 word tagging을 넘어서서 image와 sentence tagging도 가능하다

 

그러면 image가 주어질때, 해당하는 레시피를 검색한다든지, 레시피가 주어졌을때, 해당하는 음식 이미지를 검색한다든지 확장 응용이 가능

 

 

6. cross-modal translation

 

image를 CNN에 보내 얻은 feature vector를 RNN같은 text model에 넣어 text vector로 바꾸는 translation형태

 

최종적으로 image를 받아 text로 표현하는 것으로 image captioning이라고 부른다

 

이미지를 보고 해당 이미지를 설명해주는 text를 생성해주는 task

 

 

 

image를 다루는데 최적화된 구조는 CNN이고 각 단어에 대한 순서가 있는 문장을 다루는데 최적화된 구조가 RNN이다

 

 

7. RNN(Recurrent Neural network)

 

현재 time step에 input을 넣어 RNN이 output y를 내놓으면.. 이를 다시 RNN에 넣어 다음 step을 위한 예측으로 쓰는 형태

 

 

 

 

이전 history를 감안하여 다음 step의 prediction에 사용

 

순차적으로 이전에 예측한 값을 고려하여 다음 step의 예측에 활용하고 싶을때 사용하는 모델

 

 

8. 예시로 이해하는 RNN

 

h,e,l,o중 하나를 받아 hello를 추론하는 RNN

 

h를 입력하면 다음에 나올 수 있는 단어는 e이고..

 

e가 입력되면 다음에 나올 수 있는 단어는 l이며

 

l이 입력되면 다음에 나올 수 있는 단어는 l이고,

 

l이 입력되면 다음에 나올 수 있는 단어가 o가 되도록 

 

 

h,e,l,o중 하나를 표현할 수 있어서 처음에 h를 넣을때 h는 [1,0,0,0]이라는 one hot vector로 표현하여 input으로 넣고

 

h는 이전 step의 hidden vector라고 부르는데 처음 시작에는 어떠한 정보도 없었으니 zero vector를 넣는다

 

input과 이전 step의 hidden vector를 받아 현재 step의 hidden vector를 결정하게 된다

 

 

h1이 결정되면, 현재 step의 output layer에 보내 현재 step의 output을 결정

 

 

output vector에 softmax를 취해 나올 가능성이 높은 단어가 무엇인가 보았더니 'e'였다

 

 

다음 step에 이번에 나온 'e'에 해당하는 one hot vector인 [0,1,0,0]과 현재 hidden state인  h1 vector를 함께 넣어준다

 

 

두번째 output 결과는 'l'로 나왔다

 

이를 다시 다음 step의 input으로 넣고, 현재 hidden state도 같이 넣어주어 다음 step의 예측을 결정하는 것을 반복

 

 

 

 

9. RNN 모델 형태에 따른 쓰임

 

RNN이라고 부르기 민망한 one to one 형태

 

input을 넣으면 output이 바로 나오는 단순 구조

 

 

 

 

 

one to many는 하나의 input이 들어가면 output이 여러개로 나오는 형태

 

보면 현재 step의 output을 다음 step의 input으로 넣지는 않고 hidden vector만 들어간다고 표현되어있는데..

 

사실은 output이 다음 step의 input으로 들어가긴 한다고함

 

근데 그냥 input과 output사이의 관계만 명확하게 보여주고 싶어서 그랬다고함

 

아무튼 대표적으로 image captioning

 

 

 

many to one은 input이 sequence로 여러개 있고 출력은 단 하나로만 나오는 형태

 

문장이 주어질때, 어떤 카테고리를 이야기하는지..

 

객관식 문제가 주어질때 단 하나의 답만 고르는 모델이나

 

역시 다른곳에 output이 나와 활용가능 하지만 명확하게 입출력 관계를 표현하고자 표시 안했다고함

 

 

many to many는 input이 여러개 들어가서 output도 여러개 나오는 형태

 

번역기나 비디오 분류, 비디오 캡션 등이 있다.

 

 

 

매 step마다 즉시 출력을 해서 활용해야하냐 딜레이된 step에서 출력해서 활용해야하느냐에 따라 형태가 다르다

 

 

10. 대표적인 RNN 모델

 

초창기 만들어진 RNN은 매우 단순하게 생겼고 그대로 사용하면 vanishing gradient나 exploding gradient 문제가 생겼다

 

gradient descent에서 사용한 gradient가 멀리 갈수록 희석되거나, exploding되는 문제들이 발생

 

그래서 gate를 추가해서 LSTM(long short term memory), GRU(gated recurrent unit) 라는 모듈을 많이 사용한다

 

 

둘다 아직도 많이 사용되고 있는 모듈

 

내부가 복잡하게 생겼는데 핵심은 state를 누적해가면서 어떤 시점에 특정 정보를 삭제하거나 다음 시점에 어떤식으로 넘길지 선택해서 정보를 넘겨주는 형태

 

GRU는 상대적으로 최근에 나왔는데 LSTM보다 적은 parameter지만(큰 차이없다고 들었는데)

 

성능은 둘이 비슷하대

 

그래서 언제 GRU가 좋고 언제 LSTM이 좋은지는 task나 데이터마다 다르기 때문에 사용하면서 경험적으로 테스트해야한다

 

 

11. 예시로 이해하는 image captioning

 

CNN과 RNN을 잘 결합하면 이미지에서 text로 전환하는 cross modal translation의 application을 만들 수 있다

 

먼저 CNN을 활용해 image를 받아 image embedding vector를 추출

 

VGGNet에 넣어 4096 dimension의 vector를 받았다

 

 

이렇게 만든 fixed image dimensional vector를 RNN에 넣고

 

<start> token을 줘서 단어를 prediction하라고 하자

 

각 시점마다 단어가 나오고, 해당 단어를 다음 step의 input으로 주면서.. 예측해간다

 

 

 

결과를 보면.. caption이 그럴듯하게 생성되기도 하고.. 전혀 아니기도 하고

 

핸드폰 대신에 마우스라고 표현한거보면 실패할수도 있긴하지

 

 

 

12. attention

 

image vector를 4096 dimesional vector로 표현했는데..

 

이렇게 해서 RNN에 넣어 captioning을 하면.. 이미지의 어느 부분을 보고 단어를 어떻게 내놓을지

 

이미지와 상대적인 관계나 공간적 위치를 고려하지 않고 설명을 해주게 된다

 

또한 하나의 image를 하나의 vector로 pooling으로 표현하다가 작은 사물들을 무시해서 표현하는 경향이 있었다

 

이미지에 대한 문장을 만들때, 어떤 물체를 보고 이 단어를 생성하는지 판별이 안되는 경우가 많았다

 

attention이라는 발전된 개념을 이용해서 어떤 물체를 보고 단어를 생성했는지 해석이 가능하도록 만들어

 

더욱 국부적인 형태로 image captioning을 수행하게 된다

TAGS.

Comments