1탄(https://jjongyn.tistory.com/35)에 이어서 본격적으로 아래와 같은 목표를 달성해 보기 위해 베이스 코드의 구조를 수정해 보자.

 

1. Method들이 자신들의 코드를 자유자재로 추가할 수 있어야 함

   -> 각 메서드마다 파일 하나에서 모든 것이 동작하도록 수정

2. 각 method들에 대한 하이퍼 파라미터를 설정하는 게 쉬워야 함

   -> 메서드별로 하이퍼 파라미터를 수정하는 Configure 파일을 만들도록 수정

3. 모델을 Freeze 할 때, 일일이 변수명을 추가해 줄 필요가 없어야 함

   -> 기존과 같이 'prefix'의 변수명으로 해당 파라미터를 freeze 하는 게 아닌 prompt라는 객체를 선언 후 그 자체를 freeze 함으로써 모든 메서드들이 각자의 파라미터를 일일이 수정하지 않아도 되도록 변경

 

 

자. 일단 전체 폴더를 다음과 같이 구성했다. 여기서 중요한 것은? method부분이다.

 

 

method/prefix_tuning.py라는 파일 안에는 아래와 같이 구성했다. 기존과 다르게 메서드 별로 자신의 soft prompt를 선언할 수 있도록 변경했고 generate함수를 통해 임베딩에 추가 될 soft prompt를 리턴하도록 구성했다. 

method/prefix_tuning.py

아직 더 추가되어야 할 부분이 많지만, 대표적인 메서드 4개 정도의 알고리즘을 추가했다. 사실 내 주 연구 분야는 아니지만 재밌기 때문에.. 지속적으로 추적해서 새로 나오는 알고리즘들을 추가 할 예정이다. 여기서 보면 cfg를 통해서 prefix tuning에 필요한 하이퍼 파라미터들을 불러온다. cfg로 가볼까?

 

cfg.py

 

 

cfg.py는 다음과 같이 각 메소드 별로 필요로 하이퍼 파라미터를 자유롭게 추가할 수 있도록 구성했다. 이렇게 구성하는 것은 Knowledge Distillation의 코드를 참고해서 만들었다. 좋아! 지금까지 매우 깔끔하다고 생각된다. 벌써 2번까지 Clear! 

3번 prompt객체는? 더 간단하다.

 

 

main 파일에서 soft_prompt_dict를 통해 method(method/~. py)를 prompter객체로 선언 후 이를 T5모델의 입력으로 사용했다. 그리고 이 prompter만 Freeze 하면 되겠지?

 

위는 T5모델의 인코더에 해당하는 부분이다. 맨 밑에 prompt의 객체를 불러오고 안에 들어있는 soft prompt값들을 initilization 해준다!

마지막으로 이 prompter로부터 필요한 soft prompt를 생성! 

self.prompt_generate()를 통해서 필요한 soft prompt를 만들어주고, 이를 1탄에서 나온 임베딩 토큰에 붙여주면 끝!

돌려본 결과 기존과 비슷한 성능을 보여준다. 물론 아직 각 메서드마다 스케줄링을 비롯해 하이퍼 파라미터가 동일하지 않지만 이 코드를 통해 어느 정도 비교가 가능하다.

 

사실 구조만 수정했기 때문에 오래 걸리지는 않았지만 어떻게 하면 더 연구에 도움이 될까 짠 코드이기 때문에 나름 만족한다. 실제로 실험을 함에 있어서도 아이디어를 구현하는 것이 매우 편리했다. 

추후 계획은 지속적으로 나오는 방법들을 추적해서 추가하는 것이다!

 

https://github.com/JJongyn/Easy_SoftPrompt/tree/master

 

GitHub - JJongyn/Easy_SoftPrompt: LLM Easy SoftPrompt

LLM Easy SoftPrompt . Contribute to JJongyn/Easy_SoftPrompt development by creating an account on GitHub.

github.com

 

 

 

'개인 공부 > 프로젝트' 카테고리의 다른 글

[LLM] Easy Soft prompt 개발 1탄  (0) 2024.01.14
복사했습니다!