일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- REST API
- Python
- 4948
- 손실함수
- BOJ
- 9020
- 재귀
- pyenv
- 신경망 학습
- 백준
- 1101
- 실버
- N-Queen
- 백트래킹
- 개발환경
- 15649
- streamlit
- 오블완
- 파이싼
- 밑바닥부터 시작하는 딥러닝
- 가상환경
- 그리디 알고리즘
- 티스토리챌린지
- 기계학습
- end to end
- n과 m
- 1002
- 경사하강법
- 파이썬
- REST
- Today
- Total
파이톨치
Multi-modal learning [작성중] 본문
chatgpt가 발달하면서 나는 이제 인간의 지능이라고 하는 것, 즉 사고는 정복당할 것이라고 생각했다.
실제로 이러한 사고능력(수학적인 능력, 논리적인 사고력) 등이 이전보다 비약적인 발전을 하고 있다.
그렇기에 다음스텝은 이러한 사고력을 기반으로 여러가지 모달리티(감각)를 합치는 것이라 생각했다.
이러한 관점에서 멀티모달에 대해 공부하는 것은 굉장히 시기 적절한 것이다.
기본적으로 텍스트만 보고 텍스트를 추론하는 것을 uni-modal이라고 한다. 하지만 시각적인 이미지를 보고 텍스트로 출력하는 것은 시각과 text 2가지 모달리티를 결합했기에 multi-modal이라고 부른다.
딥러닝 관점에서 이러한 결합이 어려운 이유는 representation 공간 때문이다. 이는 벡터 공간이라고 하는데, 입력이 들어왔을 때, 기계는 이를 수학적인 벡터 공간에 매핑하게 된다. 즉, 어떤 이미지나 텍스트에 대해서 숫자로 표현하게 되는 것인데, 모달리티가 달라지면 이러한 벡터 공간도 서로 달라지게 때문에, 이를 한 공간에 매핑해 주는 작업이 필요하다. 또 가능한 문제점은 "사과"라는 텍스트를 보았을 때, 떠오르는 이미지는 사람마다 다르고, 서로 연결하고자 하는 벡터 차원이 너무나 상이하면 한쪽 모달리티의 힘만 강해질 수도 있을 것이다.
이러한 모달리티를 합치는 간단한 방식은 Matching이다. A라는 사물 이미지와 A에 대해 묘사하는 텍스트 주고 이를 매칭 시키지 못했을 때, loss를 주는 방식으로 하면 될 것이다.
이와 관련된 가장 대표적인 방식은 CLIP 이다. 이미지와 텍스트 쌍이 입력으로 들어 갔을 때, 예를 들어서 "강아지 이미지"와 "이 이미지는 강아지에 대한 것입니다." 라는 텍스트가 들어갔을 때 우선적으로 text encoder와 image encoder를 거치게 된다. 그렇게 했을 때 강아지 이미지와 강아지에 대한 묘사가 있는 텍스트와의 거리는 가깝게 만들고 나머지 텍스트들에 대해서는 멀어지게 만드는 것이다.
자. 다시 transformer에 대해 간단히 복습해보자. 그 중에서도 decoder 부분을 활용한 gpt 방식에 대해서 복습해보자.
이러한 방식으로 만들어지게 되는데, 아... 오랜만에 보니 또 까먹었다. Key, Value가 문맥이 되어 다음 층으로 전달되고, 그 다음 단어가 Query가 된다. 그렇다면 맨 처음에는 어떻게 하지? 아! 고정된 문장의 시작을 알리는 토큰 등이 있으니까 그것을 사용해도 되겠네!!! 아~ 그렇구나~ 여기서는 이미지가 초기 context 역할을 해도 되겠네. 우리가 프롬프트라고 부르는 것도 사실 이 context니깐 다 설명이 가능하다. 이것을 통해서 captioning은 어떻게 할까?
이렇게 문맥에 따른 원래 분포가 있을 것이고, 이미지를 보고 나온 문맥이 있을 것이다. 여기에 이제 특정 단어에 대한 분포랑 이미지에 대한 분포를 맞추면 된다고 하는데 솔직히 잘 모르겠다. 그냥 클립 인코더와 디코더를 쓰면 해결되는 문제 아닌가? 하는 생각이 들기도 한다. 기존의 클립의 문제점중하나는 생성을 하는 파이프라인이 없다는 것이고, 단순히 representation에 대해서만 학습하기에 이러한 LM을 도입해서 생성 파이프라인을 만든 것이고, 거기에 clip에서 만들어진 인코더와 디코더를 사용했다.