개발자로 후회없는 삶 살기
딥러닝 PART.교과목 VQA, CNN text에 활용 본문
서론
교과목 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 코드를 보고 개념은 어려운데 생각보다 모델 구현은 할 만할 수도 있으니 나중에 이미지와 자연어의 융합을 다룰 때 이미지 캡셔닝과 같이 보면 좋겠습니다.
참고
'[AI] > [교과목 | 학습기록]' 카테고리의 다른 글
딥러닝 PART.교과목 오토인코더(Ae) (0) | 2022.11.16 |
---|---|
딥러닝 PART.교과목 단어 임베딩 (0) | 2022.11.08 |
딥러닝 PART.교과목 RNN (0) | 2022.11.08 |
딥러닝 PART.교과목 transformer, BERT (0) | 2022.10.25 |
딥러닝 PART.교과목 yolo, segmentation (0) | 2022.10.11 |