현재 영어 Base 모델을 한국어로 학습시키는 프로젝트를 진행하는 대학생입니다. 자원 문제로 Gemma-2b을 진행하고 있는데, 
Gemma가 영어를 base로 하다보니 한국어를 확장시키기 위해 Sentencepiece에 한국어 토큰을 학습시킨 뒤, 기존 Gemma 토크나이저와 병합을 한 후, model.resize_token_embeddings(len(tokenizer))까지 적용을 하였습니다.


병합한 후 한국어 텍스트 토큰화 결과를 기존 토크나이저와 병합한 토크나이저로 비교를 진행하였습니다.

input_text = "머신러닝과 딥러닝의 차이는"

tokens = tokenizer_gemma.tokenize(input_text)

-> ['머', '신', '러', '닝', '과', '▁', '딥', '러', '닝', '의', '▁차', '이는']


input_text = "머신러닝과 딥러닝의 차이는"

tokens = tokenizer.tokenize(input_text)

-> ['▁머신', '러닝', '과', '▁딥', '러닝', '의', '▁차이는']

기존 토크나이저보다 좀 더 효율적으로 토큰화를 해주어서 이대로 Lora를 통해서 파인튜닝을 진행을 하였는데, 결과를 보니 성능이 좋지 못하였습니다.


그래서 여러 레퍼런스를 참고하면서, 위와 같은 방식은 단순하게 새로운 단어에 대한 임베딩값을 무작위 샘플링을 통해 초기화를 하여, 성능이 좋지 못하다는것을 알고, 기존 단어의 임베딩 평균값을 새로운 단어의 임베딩 값으로 대체하면 좋다고 하여, 그 방식으로 진행을 하고 있는데, 아래와 같이 적용을 하면 되는지 궁금하여 질문을 드립니다. 
  

# 기존 단어 임베딩 가져오기

old_embeddings = model.model.embed_tokens.weight.data


# 기존 단어 임베딩의 평균 계산

mean_old_embeddings = torch.mean(old_embeddings, dim=0, keepdim=True)


# 모델의 임베딩 레이어 크기 조정

model.resize_token_embeddings(len(tokenizer))


# 새로운 단어 갯수

num_new_tokens = model.model.embed_tokens.weight.data.size(0) - len(old_embeddings)


# 새로운 단어 임베딩을 기존 평균값으로 초기화

new_embeddings = model.model.embed_tokens.weight.data[-num_new_tokens:, :]

new_embeddings.data.copy_(mean_old_embeddings.repeat(num_new_tokens, 1))