고양이 같은 얀데레가 보고싶다.


혼자서 게임이나 문서작업 때문에 컴퓨터를 쓰고 있으면


자신한테 관심을 가져달라고 키보드를 두드리며 소심한 방해를 하는 얀순이가 보고싶다.


만약 컴퓨터에 여자라도 나오면 그걸 귀신같이 알아챈 얀순이가


컴퓨터 전원을 내려버려서 방해해 줬음 좋겠다. 그런 얀순이한테 짜증 한 번 내지 않고 사랑으로 쓰담쓰담 해 주고 싶다.


모니터에 집중하고 있을 때면 곁으로 달려와 머리를 들이 밀며 쓰다듬어 달라고 하는 얀순이가 보고싶다.


하지만 너무 바쁜 나머지 반응을 안 해줘서 지치고 삐진 얀순이가


조용히 따뜻한 침대로 가 엎드려 자는 모습도 보고 싶다.


(아래는 개발 일지)


=====================================================

https://arca.live/b/yandere/97189261?p=2

지난 시간, 나는 데이터 전처리 코드를 작성했다.


요약하자면, 여러가지 데이터 파일을 하나로 합치고

문장 데이터를 형태소 단위로 분리, 정리하는 코드였다.


하지만 내가 또 최근에 안 사실이 있었으니, 데이터 전처리에는 다음과 같은 과정이 추가로 필요하다는 것이었다.


일단 챗봇의 원리를 알아보자. 일단, 인공지능 모델은 텍스트를 그대로 알아 들을 수 잆다.

따라서 텍스트를 컴퓨터가 알아 들을 수 있게끔 번역해야 하는데, 그 과정을 '임베딩' 이라고 한다.


임베딩은 텍스트를 숫자로 인코딩(정보를 변환 시키는 행위)한다. 아래는 간단한 예시이다.


만약 ['안녕하세요', '사랑해'] 라는 두 가지 문장이 있다고 했을 때, '안녕'은 '0, '하'는 '1', '세요'는 '2'로 변환 시키고,

'사랑'은 '3', '해'는 '4'로 변환시킨다. 이로써 얻은 결과는 아래와 같다.


[[0 1 2],

  [3 4]]


하지만 여기서 문제가 있는데, 문자의 길이가 맞지 않는다는 것이다. 문장의 길이가 들쭉날쭉하면 모델이 학습하는 데 지장이 생길 수 있다.


이때 필요한 게 '패딩' 이다. 그냥 문장의 길이를 동일하게 맞추는 행위이다. 패딩은 보통 숫자 '0'으로 길이를 맞추는게 관습이다.

앞서 설명한 ['안녕하세요', '사랑해']를 패딩시키면 아래와 같다.


[[0 1 2],

[3 4 0]]


챗봇은 저 숫자들을 학습하고, 숫자를 먼저 출력한 다음 그 숫자를 텍스트로 변환(디코당)하여 대화하는 방식으로 작동된다.


본론으로 돌아와서, 나는 현재 형태소 단위로 문장을 분리시켰으니 이제 임베딩과 패딩 과정을 거치면 데이터 전처리는 끝난다.


코드는 아래와 같다.



GPT와 머리를 싸매고, 싸우면서 코드를 완성시켰다. 한 2시간 걸린듯.


코드의 구조는


불러온 데이터를 형태소 단위로 변환 -> 형태소들을 임베딩 ->  가장 긴 문장 계산 -> 패딩. 이렇게 되시겠다.



이런 코드를 넣어 디버그 한 결과



이렇게 잘 임베딩, 패딩 된 데이터를 볼 수 있다.


이제 테스트 데이터를 만들 차례다. 테스트 데이터란 모델의 성능을 평가하는 데이터인데,

실제 상황에서 모델이 잘 작동 하는지를 테스틀하는 데이터라고 할 수 있다.


보통 테스트 데이터는 따로 만들어서 사용하는게 보통인데, 나는 너무 귀찮아서 2600줄 중에 100줄은 내가 새로 쓰고 나머지는

그냥 기존 데이터의 순서를 섞어서 넣었다.



이렇게.


이제 모델 설계 차례인데, 나는 '트랜스포머'를 사용해 만들어볼 생각이다.


뭐. 트랜스포머는 기존 CNN(합성곱 신경망)과 RNN(순환 신경망)과 다르게 문장의 순서에 상관없이 정보를 처리할 수 있다 카더라.

트랜스포머는 어텐션 기법을 사용해서 더욱 긴 문장의 단어의 뜻을 이해하고 어쩌고 저쩌고...


이해 못하겠어서 그냥 복붙했다.



이런 복붙한 고드를 실행시키면 아래같은 멋진 화면이 뜬다.



모델의 구조가 이렇게 나온다.

각 층의 이름, 타입, 출력 모양, 파라미터 개수가 나오는데, 무슨 의미인지 정확하게는 모르겠다.


나중에 알게 되겠지.


아무튼 다음시간에 보자.


여기까지 읽어준 챈럼들 너무 고맙다.