개발자로 후회없는 삶 살기

딥러닝 PART.교과목 VQA, CNN text에 활용 본문

[AI]/[교과목 | 학습기록]

딥러닝 PART.교과목 VQA, CNN text에 활용

몽이장쥰 2022. 10. 23. 14:43

서론

교과목 5주차 고급 신경망 활용에 관한 내용을 정리합니다.

본론

- VQA

컴퓨터에게 사진을 주면서 사진에 관한 질문을 합니다. = 묻는 말이 이 영상에서 뭘 묻는 건지 영상과 자연어를 잇는 문제입니다. > 대답은 또 자연어로 답합니다. > 5지 선다로 객관식입니다. > 지금 비가 오고 있니? 자연어를 이해해서 영상에서 답을 찾아서 자연어로 대답을 하는 것입니다.

 

=> 코드

1. cnn 모델

2. rnn 모델

-> 임베딩 매개변수는 동일합니다. (단어의 종류 10000가지, 256 크기의 벡터로 바꿈, 최대 입력은 100개)

 

+ 256 벡터 100개가 쫙 있는데 이걸 lstml에 넣는다는 게 100 단어를 한 번에 넣는 게 아니고 첫 번째 넣고 두 번째 넣고 쭉쭉쭉 넣어서 100번째 단어를 넣습니다. > 그러면 출력으로 hidden 벡터로 압축된 정보가 나옵니다. = 질문을 벡터화 압축한 것입니다.

 

-> 그 두개를 concat을 해서 두 개를 붙이고 dense를 합니다. > Dense 1000은 1000개 중 하나를 맞춰라는 뜻!

★ 이 pdf는 교육용이지 답이 잘 나오지 않을 것입니다. 성능을 기대하지 마라고 하십니다.

 

∴ VQA 추가 공부 (https://www.youtube.com/watch?v=uY6cWyG0JRQ)

- 위 동영상에서 연구자가 VQA를 발표 주제로 선정한 목적

자연어 처리에서 이미지 데이터를 활용하거나, 이미지에서 트랜스포머와 같은 모델을 접목하려는 시도가 늘어서 자연어와 이미지의 통합을 다뤄보았습니다. + 이미지 캡션보다 좀 더 깊은 cv와 nlp의 결합입니다.

 

=> VQA란?

입력 : 이미지와 텍스트(질문) -> 질문은 이미지를 참조하지 않으면 대답하기 어려운 질문으로 구성(모델이 이미지에서 답을 찾을 수 있어야 합니다.)
출력 : 질문에 대한 답 -> 객관식 or 단답식(yes or no)

 

=> 데이터 셋

총 3개 : 이미지로 코코/ 자연어로 사람말의 질문/ 사람말의 답 -> 이미지, 질문, 답 3개

 

> 이것으로 이미지와 NLP 두 분야의 데이터를 다룰 수 있어야 접근할 수 있는 범위임을 알았습니다.

 

 

- VisualQA  공식 사이트 코드 실행 (https://github.com/VedantYadav/VQA.git)

교과목 교재의 코드는 교육 목적으로 성능을 기대하기 어려우니 공식 사이트 코드를 실행해 보겠습니다.

1. Requirement

-> 코랩으로 하니깐. py 파일을 실행하기 어려웠습니다. virtual box 리눅스로 진행하겠습니다.

 

- 우분투에서 실행

※ 우분투에서 파이썬 가상환경을 만들어주기 위해서는 conda와 비슷한 가상환경을 만들어주는 virtual env를 사용해야 합니다. 또한 파이썬 버전을 맞춰는 것이 가상환경과 내 우분투 로컬 환경과 다르니 주의해야 합니다.

=> 파이썬 2.7 설치

-> 가상환경을 만드려고 해도 실제 파이썬이 깔려있어야 합니다.

 

 

-> 이후로 넘파이, 판다스, scipy, 케라스, 테아노 설치

 

=> nltk에서 이슈

 

-> 파이썬 2.7에서는 nltk를 지원하지 않는다.

 

 

2. 실행 

 
 

 

 

 

- CNN text에 활용

텍스트로 행렬로 표기하면 이미지를 28*28의 행렬로 표기한 것과 다를 바 없습니다. 

 

-> 그렇다면 행렬로 표기를 어떻게 할까요? 기본 단위를 단어로 하여 유사한 단어를 모두 함께 모은 후 이를 대표하는 기호로 나타냅니다. (임베딩)

+임베딩을 할 때 주의할 점 : 행렬화를 하면 이미지를 표기하는 것과 다를 바 없다고 했는데 1. 단어는 행렬보다는 벡터에 가깝고, 2. 이미지는 인접한 픽셀이 연관성이 컸는데 단어는 인접한 단어라고 해서 연관성이 크다고 볼 수 없습니다. (이게 엄청 큰 차이입니다.)

 

=> CNN이 텍스트에 쓰이는 곳

1. 감정분석 

2. 텍스트가 유용한 정보인지 스팸인지 이해해야 하는 스팸탐지 

3. 텍스트의 모든 것을 이해해야하는 주제 분류

 

-> cnn이 텍스트에 안 되는 것

1. 논리적 역할(동사, 부사, 주어)을 이해하는 것이 목표인 품사태깅

2. 개체추출
∴ 텍스트의 논리를 따지면 cnn이 적합하지 않나 봅니다.

 

- 워드 임베딩 강화

텍스트 내의 단어들을 밀집 벡터로 만드는 것을 말합니다., 원-핫이 대부분 0의 값에 단 하나의 1의 값이면, 워드 임베딩으로부터 얻은 임베딩 벡터는 상대적으로 저 차원을 가지며 모든 원소의 값이 실수입니다.


 
-> 단어를 원-핫 벡터로 만드는 과정을 one-hot encoding이라고 한다면, 단어를 밀집 벡터로 만드는 작업을 워드 임베딩(word embedding)이라고 합니다. > 임베딩 벡터는 주로 256, 512, 1024 등의 차원을 가집니다. > 임베딩 벡터는 초기에는 랜덤값을 가지지만, 인공 신경망의 가중치가 학습되는 방법과 같은 방식으로 값이 학습되며 변경됩니다.

 

+ 반드시 정수값을 입력으로 받아야 한다.


=> Embedding() 

Embedding()은 단어를 밀집 벡터로 만드는 역할을 합니다. "인공 신경망 용어"로는 임베딩 층(embedding layer)을 만드는 역할  ex) Embedding(vocab_size, embedding_dim, input_length=5) 

 


-> 인자 : 

vocab_size : 즉, 총단어의 개수/ embedding_dim : 결과로써 나오는 임베딩 벡터의 크기/ input_length : 입력 시퀀스 길이

 

- 코드

def build_model():
	model = models.Sequential()
    # 임베딩
	model.add(layers.Embedding(n_words, dim_embedding, input_length=max_len))
	model.add(layers.Dropout(0.3))
	model.add(layers.Conv1D(256, 3, padding='valid', activation='relu'))
    
    
	model.add(layers.GlobalMaxPooling1D())
	model.add(layers.Dense(128, activation='relu'))
	model.add(layers.Dropout(0.5))
	model.add(layers.Dense(1, activation='sigmoid'))

	return model

-> 코드를 보며 궁금한 게 생겼습니다. RNN의 경우 한 개의 단어를 순차적으로 입력을 하기에 임베딩도 한 개씩 된다고 생각했습니다. 근데 CNN으로 하면 주변 단어를 봐야 하기에 주변 단어도 임베딩이 되어있어야 합니다.

 

-> 이를 표현한 그림으로 RNN과 CNN시에 임베딩 작동 범위가(1개 vs kernel size개) 다른 거 같습니다.

 

 

 

결론

1. VQA 코드를 보고 개념은 어려운데 생각보다 모델 구현은 할 만할 수도 있으니 나중에 이미지와 자연어의 융합을 다룰 때 이미지 캡셔닝과 같이 보면 좋겠습니다.

 

 

 

참고

Comments