본문 바로가기

IT 실무

웹브라우저에서 언어 모델을 학습시켜 보자

반응형

지난번 정말 작은 언어 모델을 Python으로 만드는 과정을 포스팅한 적이 있다. 사실 히든 레이어조차 없는, LLM은 커녕 그냥 최소한의 다음 단어 예측 프로그램을 만든 것이다. 최신 상용 LLM에 쓰이는 트랜스포머 구조까진 아니라도 최소한 수치적으로 언어가 학습되고 단어가 예측되어 나오는 과정을 보는 데에는 그런 간단한 소스코드가 큰 도움이 된다. 

 

사실 내 코드는 그냥 집에 파이썬만 깔려 있으면 돌려볼 수 있고 이래저래 로그도 찍어볼 수 있으니 그냥 실행을 시켜보는게 가장 좋다. 하지만 귀찮아서 코드만 보신 분들께서 실제 돌아가는 모습을 볼 수 있는, javascript로 거의 동일하게 개발된 웹 페이지를 찾아서 소개하고자 한다.

 

https://seb.kr/web_llm/

 

개발자 도구 - Tiny LLM (브라우저 학습)

Tiny LLM (브라우저 학습) 이 페이지는 브라우저만으로 간단한 언어모델을 학습합니다. 텍스트를 공백 기준 단어로 토큰화하여 임베딩 + 선형(Softmax) 모델을 SGD로 학습합니다. 큰 말뭉치를 넣으면

seb.kr

 

여기다 내 포스팅에서 사용한 학습 데이터를 넣고, 임베딩 사이즈, 블록 길이, 학습률 등을 적절히 조절해가며 훈련을 시켜 보면 가사 하나 정도는 잘 학습되고 예측해내는 것을 확인할 수 있다.

 

다만 이 페이지는 내가 아직 설명하지 않은 개념들도 나오고 조금은 다른 컨셉으로 만들어져있으므로 약간의 설명이 필요하다.

 

1. 아마도 이 페이지는 우리가 예제로 개발하던 모델보다 훨씬 작은 데이터를 대상으로 학습하는 것을 목적으로 한 것 같다. 사실 디폴트로 세팅된 학습률 0.2는 너무 크고 에포크 5로는 정말 학습할 수 있는 데이터는 몇 문장이 다일 것이다. 우리가 사용한 것과 같은 가사 하나 정도를 학습시키려면 에포크는 훨씬 크고 학습률은 훨씬 작아야 한다.

 

2. 에포크(Epoch)가 무엇인지는 여기 위키를 참고하자. 간략히 말해 학습데이터 전체가 한 번 학습되는 것을 의미하는 단위이다. 기존에 우리의 소스코드는 그냥 데이터의 랜덤 위치를 무작위로 학습했는데 이는 소스코드의 간결함을 위해서였다. 에포크를 구현하려면 몇줄이 더 필요하기 때문이다. 하지만 실제 인공지능 학습에선 무작정 랜덤으로 하기보단 주어진 데이터를 처음부터 끝까지 한번 다 읽고, 학습이 더 필요하면 또 처음부터 끝까지 다 읽는 과정을 반복한다. 그래서 우리는 학습 루프를 몇만 번씩 돌렸지만 그건 한 블록 단위의 루프였고, 여기서의 에포크는 그보단 훨씬 적을 수 있다.

 

3. 그래서 러닝레이트와 에포크를 몇으로 설정해야 하는가? 그걸 연습해 보는 것이 이 실습 페이지의 목적일 것이다. 데이터의 크기, 임베딩 사이즈, 블록 길이 등에 따라서 다 다르다. 스스로 여러가지를 시도해보길 바라지만, 우리의 학습 데이터 기준으로는 대략 임베딩 사이즈 32, 블록 길이 4, 에포크 1000, 러닝레이트 0.02 정도면 괜찮은 결과물이 나온다. 하지만 이정도로는 가사가 완벽히 복제되어 나오는 수준은 아닌데, 그렇게 만들고 싶으면 러닝레이트를 조금 낮추고 에포크를 조금 늘리면 된다.

 

4. 온도(Temperature)란 언어 모델이 출력을 하는 순간에 어느정도의 랜덤성을 부여할 것인가를 의미한다. 가사를 거의 복제해서 뱉어내도록 학습을 완료한 상태에서, 온도를 조금 낮추면 약간의 변형된 문장들을 뱉어내는 것을 확인할 수 있다.

 

 

이 사이트엔 언어모델 뿐만 아니라 리그레션, SVM, K-means, K-nn, 의사결정나무 등 여러 기초적인 머신러닝 모델들을 테스트해볼 수 있는 기능들이 마련되어 있다. 시각적으로 보고 이해하기 좋게 되어 있으므로 인공지능에 관심이 많지만 아직 개념 정립이 덜 된 학습자라면 애용해볼만 하다.

반응형