지난 2주간 글 작성을 거의 안하고 있었는데
뭐, 이거 하느라 글 쓸 시간이 없었습니다.

후술 하겠지만, 하루에만 모델 몇 개씩 굽고 벤치마크하는 삶을 살았습니다.


서론
시나트라 0.1 버전(미스트랄 0.1 기반입니다.)을 구우면서 가장 크게 느꼈던게
1. 한국어를 애매하게 한다. (이해는 하는데 출력이 조금 이상한 정도.)

2. 한국어를 학습을 시킬때 loss가 지나치게 빠르게 붙는다.

였는데요.

이상하다는게 어떤 형식이었냐면,

"해당 부분을 리construct 하면"

이런식으로 언뜻 보기에는 그냥 고장난 모델 처럼 보이는 현상이었습니다.


이런 미스트랄의 출력을 보고 든 생각이


질문은 잘 이해하면서, 출력이 저런 형식으로 되는거면 내부적으로 서로 다른 언어가 마치 하나의 언어처럼 유기적으로 연결된게 아닐까?

이런 현상때문에 미스트랄이 multilingual task를 잘하고, 그 어떤 모델보다(당시) parameter efficient 하지 않을까?

라는 생각을 했었습니다.


그래서, 오히려 이런 애매한, 한국어 영어를 섞어서 출력하는 현상을 이용할 수 있지 않을까? 싶었습니다.



한국어와 영어를 인위적으로 섞은 후 그런 데이터로 학습을 진행한다면 임베딩 단계에서 한국어와 영어가 유기적으로 연결되지 않을까?

라는 생각을 했습니다.


Tsunami is 가장 dangerous한 natural disaster 중 하나이다. Originally는 해저 지진으로 인해 생기는 tidal wave를 말하는데, 일본에서 frequently 발생하다 보니 these days는 지진해일을 typically 대표적인 Japanese-style 영어 표현인 'tsunami'로 통용하고 있다.

이런 문장을 가지고 학습을 시켜보면 어떨까? 라는 생각이었습니다.

당시에는 이런 생각만 하였고, 바로 진행은 하지 못했습니다. 다른 모델 굽느라 바쁜것도 있었고 막 모델 굽기 시작한 늅늅이라서 뉴비인 제가 생각할 정도면 다들 이미 해봤을 거라는 생각도 있었던것 같습니다.



실행

해당 아이디어를 실제로 구현하게 된 건 약 2주 전부터입니다. (정확히는 2월 24일)
계기는 다른분이랑 이야기를 나누다가 해당 주제가 나왔는데, "당장 해보자!"라는 분위기가 형성되서 시작했던것 같네요.

처음 며칠은 데이터를 구성했습니다.


고전적 NLP를 사용해서 형태소 분석등의 방법으로 대규모로 데이터셋을 제작해보려고 했습니다.

그러나, 문맥에 따른 의미 등, 이 방법으로는 해결이 되지 않을 것 같았기에 단순 무식하게 GPT에 few-shot 넣어서 만들자!의 방법이 사용되었습니다.


Tsunami is 가장 dangerous한 natural disaster 중 하나이다. Originally는 해저 지진으로 인해 생기는 tidal wave를 말하는데, 일본에서 frequently 발생하다 보니 these days는 지진해일을 typically 대표적인 Japanese-style 영어 표현인 'tsunami'로 통용하고 있다.

이런 문장을 code-mixing한 문장이라고 표현을 하는데요. GPT에게 해당 개념과 몇가지 예시를 보여준 후, 생성을 진행했습니다.


만들어진 데이터셋은 이런 느낌입니다. (약 62k)


원본 한국어 문장을 바탕으로 code-mixing한 문장을 생성하는 task를 진행하였고, 결과물의 토큰수, 퍼센트 등을 분석하여 전처리를 진행했습니다.


가설

실험하기에 앞서 저의 가설을 아래와 같았습니다.

1. 영어 모델에 영어위주의 문장부터 시작해서, 한국어 위주의 문장 순서로 학습을 시키면 유기적인 임베딩이 형성될 것이다.

-> 따라서, 영어 벤치마크의 점수가 최소한으로 하락하면서 한국어 학습 또한 기존 지식을 가져오기에 한국어만 학습시킨것 보다 좋을 것이다.

2. 그렇다면, 임베딩, lm_head만 열어넣고 먼저 수렴시킨후 Instruction 튜닝을 하면, 유의미한 차이가 있지 않을까?


이 정도의 가설을 세우고 실험을 진행했습니다.


실험

(무수한 학습의 흔적... 하이퍼파라미터 수정한다고 지운 로그까지 포함하면 훨씬 많습니다. a100 8대 1주일 풀가동..)


가진 데이터로 가능한 거의 모든 조합으로 학습을 진행해보았습니다.


- 위 가정 1 대로 영어 많은 순서로 raw학습 진행하기.

- 랜덤하게 raw학습 진행하기.

- 임베딩 레이어 제외 얼린 후 학습 진행하기.

- 문장 수정 task로 학습시키기 (code-mix to original)

- 영어 토큰에 한해서 loss 계산 제외하기

- 위 학습들에 대해서 단순 영어, 한국어 데이터 50% 섞어서 진행하기.

- 그렇게 튜닝 된 모델들에 Instructon 먹여보기 등등...


정말 수많은 경우의 수로 실험을 해보았고.

해당 모델들의 체크포인트를 epoch당 16으로 설정해서 각각 체크포인트에 대한 kobest, hellaswag, winogrande 등의 벤치마크를 돌려보았습니다.


결과 (최종 결과 아님!)


생각 할 수 있는, 거의 모든 경우의 수를 시도해보았습니다.

(벤치마크 결과 일부분)


그러나, 벤치마크에서 유의미한 결과는 얻지 못했습니다.

모델 써보면 꽤나 괜찮은 것 같은데, 벤치마크에서는 딱히 뛰어난 모습을 보이진 않더군요.

그래서, 뭐 어쩌라는거죠?



위에 보여드린 실험들은 1주일 전(3월 3일)까지 했던 결과입니다.

중간 체크포인트들, 결과물, 모델 출력을 보았을때 가능성은 보였습니다.

하루종일 아카이브를 뒤져보며 비슷한 연구 결과를 찾아보기도 하고, 여러 사람들에게 조언을 구하며 새로운 가설들을 세워나갔습니다. (관련된 학습은 현재 진행형)


그러던 중, 충격적인 소식을 접하게 되었습니다. (3시간 전)


다른 분께서 몇개월 전에 비슷한 실험을 진행 하셨더라구요..? (아카이브만 뒤져봐서 못찾았음 ㅠ)

데이터셋 구성도 비슷했고, 훈련 방식도 비슷했습니다.

https://github.com/MrBananaHuman/PangyoCorpora/blob/main/Knowledge%20Transfer%20in%20Multilingual%20LLMs%20Based%20on%20Code-Switching%20Corpora.pdf

(논문링크)


6장 정도 되는 짧은 논문이지만 핵심 아이디어는 비슷.. 거의 같았습니다.

다만, 도출된 결과가 많이 달랐습니다.


단순 오차라고 하기에는 비슷한 실험에서 결과가 너무 달랐습니다.

그래서 오히려 안심? 되었던 것 같네요.


그래서 결론은

이런저런 실험 계속 하느라 글 안싸고 있었습니다.

하던 실험을 이미 누군가 했다? -> 그런데 결과가 많이 다르다...?

해당 논문에서 조금의 인사이트를 얻어서 다른 실험 이어서 하는 중입니다.


원래 private하게 진행하고 paper랑 같이 발표 하려고 했는데 펑 해버렸습니다.


허깅페이스에 관련 데이터셋 업로드 하였고, 중간 체크포인트 모델들도 업로드 할 계획입니다.

완전히 성과가 없는건 아니라서, 상세한 내용은 paper로 찾아뵙겠습니다.