제가 만들고있는 토크나이저가 제 목적에 부합할까요?

토크나이저를 만드는 데 까지 성공은 했는데 확신이 안 들어서 질문 합니다.
xwin-mlewd-13b-v0.2.Q8_0.gguf
트랜스포머
GGUF
야마
텍스트 생성 추론
huggingface에 이렇게 나와 있습니다.
koboldcpp로 실행하면 챗봇과 시나리오를 작성 할 수있죠.
Faraday로도 실행 가능해서 챗봇용으로 좋은 거 같습니다.
특히 캐릭터 챗봇으로 활용하기 좋은 언어모델입니다.
단점은 영어 모델이라서 번역기 느낌이 강합니다.
llama.cpp로 만들어졌다고 하네요.
토크나이저를 추가 학습하려고 데이터셋을 열심히 만들고있습니다.
소설 위주로 만드는 중입니다.
그러다보니 문자열을 자주 사용합니다.
|START_OF_TITLE|>
|START_OF_CHAPTER|
|START_OF_DIALOGUE|>
|START_OF_THOUGHT|>
|NAME|>
|END_OF_BOOK|>
더 있는지는 모르겠습니다.
ms 코파일럿을 이용해 알아낸 문자열들입니다.
전부 선택 사항이라고 하네요.
그래도 전 시작과 끝 대화내용 생각과 감정 이름 정도 사용합니다.
이름은 언어모델이 한국어 이름을 잘 인식하지 못할까봐 1번씩 사용했습니다.
뭐 이런식이죠.
소설을 보다보면 이름들이 많이 나옵니다.
혜진, 진희, 영희, 소은, 수빈, 철수, 진수, 경태 등등
반복적으로 나옵니다.
처음 나올때 1번씩 이름 문자열을 사용했습니다.
혜진의 이름이 반복적으로 나온다면 혜진이 처음 나왔을때 이름 문자열을 1번 사용하는 식입니다.
문자열들을 사용해 데이터셋을 만들고는 있습니다.
텍스트 파일 하나에 |START_OF_TITLE|>를 추가해 소설 시작을 알리고 |END_OF_BOOK|>을 사용해 끝을 알리고있습니다.
이런식으로 소설 1개씩 텍스트 파일 하나에 추가 중입니다.
그런데 이런식으로 데이터셋을 만들면 언어모델에서 시나리오 작성할때 제가 원하는대로 작동할지 확신이 안 섭니다.
예를하나 들어 보겠습니다.
제가 추가한 데이터셋에 고등학교 수학 여행 내용이 있습니다.
경주로 수학여행을 가서 불국사를 구경했다는 내용입니다.
단순하죠??
이 내용을 koboldcpp에서 다른걸로 바꿔 봅시다.
경주가 아닌 제주도로 바꾸고 불국사가 아닌 해변에서 놀다 저녁에는 횟집에서 회를 먹는 이야기로 작성이 될까요?
등장인물들은 그대로이거나 아니면 경주로 갔고 불국사를 구경하는 배경은 놔두고 등장인물만 바꾼다거나 이런 게 가능할지 아니면 등장인물과 배경은 그대로이고 계속 시나리오 작성이 되는지 확신이 안 섭니다.
아니면 제가 언어모델을 망치고 있는지 모르겠습니다.

  • 아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요, kbuwel님. 토크나이저를 만드는 과정에서의 고민을 잘 이해했습니다.

질문을 정리해보면, 토크나이저를 만들고 추가 학습을 위해 데이터셋을 만드는 과정에서, 특정 문자열을 사용하여 소설의 시작과 끝, 대화, 생각, 이름 등을 표현하고 있습니다. 그리고 이렇게 만든 데이터셋을 이용해 언어 모델을 학습시킬 때, 원하는 시나리오를 잘 생성할 수 있을지, 예를 들어, 특정 배경이나 인물을 바꾸는 등의 작업이 가능할지에 대한 의문이 있으신 것 같습니다.

먼저, 토크나이저를 만드는 과정에서 사용하신 방법은 매우 합리적입니다. 특히, 소설의 시작과 끝, 대화, 생각, 이름 등을 표현하는 특정 문자열을 사용하는 것은 언어 모델이 이러한 요소들을 더 잘 이해하고, 이를 바탕으로 더 정교한 텍스트를 생성하는 데 도움이 될 것입니다.

그러나, 언어 모델이 특정 시나리오를 생성하는 능력은 대부분 학습 데이터에 의존합니다. 즉, 모델이 경주에서의 수학여행을 제주도에서의 여행으로 바꾸는 등의 작업을 수행하려면, 이러한 시나리오 변경에 대한 충분한 학습 데이터가 필요합니다. 또한, 이러한 작업은 일반적으로 언어 모델의 능력을 넘어서는 부분이며, 이를 위해서는 추가적인 알고리즘 또는 접근 방법이 필요할 수 있습니다.

따라서, 현재의 방식으로 계속 데이터셋을 만들고 학습을 진행하는 것은 문제가 없습니다. 하지만, 특정 시나리오를 생성하거나 변경하는 능력을 향상시키려면, 이에 대한 추가적인 연구와 개발이 필요할 것입니다.

아래는 PyTorch를 이용한 언어 모델 학습의 예제 코드입니다. 이를 참고하여 진행해보시면 도움이 될 것 같습니다.

import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambda

# 데이터셋 로드
training_data = datasets.FashionMNIST(
    root="data",
    train=True,
    download=True,
    transform=ToTensor(),
)

# 데이터로더 생성
train_dataloader = DataLoader(training_data, batch_size=64)

# 모델 정의
class NeuralNetwork(nn.Module):
    def __init__(self):
        super(NeuralNetwork, self).__init__()
        self.flatten = nn.Flatten()
        self.linear_relu_stack = nn.Sequential(
            nn.Linear(28*28, 512),
            nn.ReLU(),
            nn.Linear(512, 512),
            nn.ReLU(),
            nn.Linear(512, 10),
            nn.ReLU()
        )

    def forward(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

model = NeuralNetwork()

# 손실함수와 옵티마이저 정의
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)

# 학습 루프
def train_loop(dataloader, model, loss_fn, optimizer):
    size = len(dataloader.dataset)
    for batch, (X, y) in enumerate(dataloader):
        # 예측 및 손실 계산
        pred = model(X)
        loss = loss_fn(pred, y)

        # 역전파
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if batch % 100 == 0:
            loss, current = loss.item(), batch * len(X)
            print(f"loss: {loss:>7f}  [{current:>5d}/{size:>5d}]")

train_loop(train_dataloader, model, loss_fn, optimizer)

이 코드는 PyTorch 공식 튜토리얼에서 제공하는 코드로, 기본적인 신경망 학습 과정을 보여줍니다. 이를 바탕으로 자신만의 언어 모델 학습 코드를 작성하실 수 있습니다.

더 자세한 내용은 PyTorch 공식 튜토리얼(Welcome to PyTorch Tutorials — PyTorch Tutorials 2.1.1+cu121 documentation)을 참고하시면 좋을 것 같습니다. 특히, 언어 모델링에 대한 튜토리얼(https://pytorch.org/tutorials/beginner/transformer_tutorial.html)은 매우 유용할 것입니다.

마지막으로, 제 답변이 틀릴 수도 있으니, 다른 자료나 의견도 참고하시는 것을 권장드립니다. 행운을 빕니다!


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 Anthropic의 Claude-2 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요 kbuwel님,

제가 보기엔 kbuwel님이 만드시는 토크나이저와 데이터셋이 분명 제 목적에 맞게 잘 구성되고 있다고 생각합니다.

kbuwel님께서 문자열 태그들을 소설 데이터에 추가하여 시작, 끝, 대화, 생각, 인물 등을 구분짓는 것은 문장 생성에 도움이 될 것 같습니다.

특히 인물 이름을 한번씩 반복적으로 사용하시는 점은 언어모델이 인물들을 구분하고 기억하는데 유용할 것으로 보입니다.

제주도 여행으로 시나리오를 바꾸셨을 때, 인물과 배경을 일부 수정한다면 언어모델이 이를 반영할 가능성이 높다고 봅니다.

완전히 새로운 내용을 생성한다기보다는 주어진 인물과 배경을 바탕으로 변형을 가하는 정도면 문제 없을 것 같습니다.

다만, 언어모델의 성능과 표현 능력의 한계상 완전히 다른 시나리오를 생성하기는 어려울 수 있습니다.

kbuwel님의 접근이 잘못된 것이 아니라 언어모델 자체의 제약으로 보시면 될 것 같습니다.

지속적인 학습과 표현 데이터 확보를 통해 성능이 점진적으로 향상될 것으로 기대합니다.

추가로 궁금한 점이 있다면 문의 부탁드립니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-4-Turbo 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요! 토크나이저와 데이터셋을 만드는 과정에서의 고민을 잘 읽었습니다. 질문을 요약해보면, 특정 형식의 토큰을 사용하여 소설 데이터셋을 구축하고 계시고, 이 데이터셋을 활용해 언어 모델을 추가 학습시키고자 하시는데, 이렇게 만든 데이터셋이 실제로 언어 모델이 시나리오를 작성하는 데에 효과적일지, 그리고 언어 모델의 성능에 부정적인 영향을 주지 않을지에 대한 확신이 서지 않는 상황으로 보입니다.

데이터셋을 구축할 때 사용하는 특수 토큰들은 모델이 텍스트의 구조를 이해하는 데 도움을 줄 수 있습니다. 예를 들어, 소설의 시작과 끝, 대화의 시작과 끝 등을 나타내는 토큰들은 모델이 텍스트의 흐름을 파악하는 데 유용할 수 있습니다. 하지만 이러한 토큰들이 모델의 학습에 어떤 영향을 미칠지는 실제로 실험을 해보지 않으면 알 수 없습니다.

언어 모델이 새로운 시나리오를 생성할 때, 모델이 학습한 데이터셋의 패턴을 따르려고 할 것입니다. 따라서, 만약 경주로 수학여행을 가는 내용이 데이터셋에 포함되어 있다면, 모델은 그와 유사한 시나리오를 생성할 가능성이 높습니다. 하지만 모델이 충분히 유연하고 다양한 데이터를 학습했다면, 제주도로 여행을 가는 시나리오를 생성하는 것도 가능할 수 있습니다.

모델이 원하는 방향으로 시나리오를 작성하게 하려면, 다음과 같은 접근 방법을 고려해볼 수 있습니다:

  1. 다양한 데이터셋: 모델이 다양한 시나리오를 학습할 수 있도록 다양한 내용의 텍스트를 데이터셋에 포함시키세요.
  2. 파인 튜닝: 특정 주제나 스타일에 맞게 모델을 파인 튜닝하여, 원하는 방향으로 시나리오를 생성하도록 유도할 수 있습니다.
  3. 프롬프트 엔지니어링: 모델에 입력하는 프롬프트를 조작하여, 원하는 결과를 얻을 수 있도록 유도합니다. 예를 들어, "제주도로 수학여행을 간 학생들의 이야기"와 같은 프롬프트를 사용할 수 있습니다.

실제로 데이터셋을 만들고 모델을 학습시키는 과정에서는 다음과 같은 코드를 참고할 수 있습니다:

from transformers import GPT2Tokenizer, GPT2LMHeadModel

# 토크나이저와 모델을 로드합니다.
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2LMHeadModel.from_pretrained('gpt2')

# 특수 토큰을 토크나이저에 추가합니다.
special_tokens_dict = {'additional_special_tokens': ['|START_OF_TITLE|', '|END_OF_BOOK|', '|NAME|']}
num_added_toks = tokenizer.add_special_tokens(special_tokens_dict)
model.resize_token_embeddings(len(tokenizer))  # 모델의 임베딩 크기를 조정합니다.

# 데이터셋을 준비하고 모델을 학습시키는 코드를 작성합니다.
# 예를 들어, Hugging Face의 Trainer API를 사용할 수 있습니다.

이 코드는 GPT-2 모델을 예로 들었지만, 실제로 사용하시는 모델에 맞게 조정하셔야 합니다. 추가적으로, 모델 학습에 대한 더 자세한 정보는 PyTorch 공식 문서나 Hugging Face 문서를 참고하시면 도움이 될 것입니다.

마지막으로, 언어 모델을 망치고 있다는 걱정은 너무 하지 않으셔도 됩니다. 실험과 시행착오를 통해 모델을 개선하는 것은 머신 러닝 과정의 일부입니다. 다만, 모델이 원하는 방향으로 학습되고 있는지 지속적으로 평가하고, 필요한 경우 데이터셋이나 학습 방법을 조정하는 것이 중요합니다.

제 답변이 도움이 되었길 바라며, 추가적인 질문이 있으시면 언제든지 문의해 주세요.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!