ymcui / Chinese-LLaMA-Alpaca-2

中文LLaMA-2 & Alpaca-2大模型二期项目 + 64K超长上下文模型 (Chinese LLaMA-2 & Alpaca-2 LLMs with 64K long context models)
Apache License 2.0
7.04k stars 581 forks source link

词表扩充 + 增量训练前 如何引入更多 special tokens #409

Closed ZeyuTeng96 closed 8 months ago

ZeyuTeng96 commented 9 months ago

提交前必须检查以下项目

问题类型

其他问题

基础模型

Chinese-LLaMA-2 (7B/13B)

操作系统

Linux

详细描述问题

在使用Llama2进行词表扩充 + 中文数据增量预训练时,想在预训练前引入更多的special token (比如:<|User|>, <|Assistant|>,<|System|>等)。是通过何种方式引入呢?

是在合并完词表,保存chinese_llama.model并重新加载tokenizer后 - 50行后 52行前(https://github.com/ymcui/Chinese-LLaMA-Alpaca/blob/main/scripts/merge_tokenizer/merge_tokenizers.py#L50),通过:%EF%BC%8C%E9%80%9A%E8%BF%87%EF%BC%9A) tokenizer.add_special_tokens({'additional_special_tokens': ['<|User|>', '<|Assistant|>', '<|System|>']}) 这个方法引入嘛?

还是在训练chinese_sp_model时(https://github.com/ymcui/Chinese-LLaMA-Alpaca/blob/main/scripts/merge_tokenizer/merge_tokenizers.py#L18),通过某种方法引入呢?%EF%BC%8C%E9%80%9A%E8%BF%87%E6%9F%90%E7%A7%8D%E6%96%B9%E6%B3%95%E5%BC%95%E5%85%A5%E5%91%A2%EF%BC%9F) 尝试过通过如下方式训练chinese_sp_model,但是并不能将<|User|>, <|Assistant|>, <|System|>作为special token spm.SentencePieceTrainer.train(input='./wiki.txt', model_prefix='wiki', model_type='bpe', vocab_size=20000, byte_fallback=True, user_defined_symbols= ['<|User|>', '<|Assistant|>', '<|System|>'])

还是其他方式呢?

依赖情况(代码类问题务必提供)

# 请在此处粘贴依赖情况(请粘贴在本代码块里)

运行日志或截图

# 请在此处粘贴运行日志(请粘贴在本代码块里)
ymcui commented 9 months ago

添加更多token无非就是在tokenizer中增加更多的entry,最终体现在模型上的词向量矩阵和LM-head矩阵增加对应的列。 如果你已经确定要加什么token了,直接在transformers的tokenizer应用.add_tokens()方法(或者类似的方法,具体自己查官方文档)。

ZeyuTeng96 commented 9 months ago

添加更多token无非就是在tokenizer中增加更多的entry,最终体现在模型上的词向量矩阵和LM-head矩阵增加对应的列。 如果你已经确定要加什么token了,直接在transformers的tokenizer应用.add_tokens()方法(或者类似的方法,具体自己查官方文档)。

  1. 请问是否可以在50行后 52行前([https://github.com/ymcui/Chinese-LLaMA-Alpaca/blob/main/scripts/merge_tokenizer/merge_tokenizers.py#L50),通过: tokenizer.add_special_tokens({'additional_special_tokens': ['<|User|>', '<|Assistant|>', '<|System|>']}) 这个方法引入呢?

  2. add_tokens()方法和add_special_tokens()方法有什么区别呢?

  3. 训练sp model时,传入user_defined_symbols的作用是什么呢?

烦请您指教一下

ZeyuTeng96 commented 9 months ago

@iMountTai 请问您能解答一下嘛?

iMountTai commented 9 months ago
  1. 没尝试过,不确定是否可行并可用。
  2. 两个方法本质上是等价的,可以查看接口文档确定使用方法。tokenizer.add_special_tokens({'additional_special_tokens': ['<|User|>', '<|Assistant|>', '<|System|>']})可以在加载tokenizer后使用。
  3. 训练sp model时我们基本用的都是默认参数,所以user_defined_symbols的作用还需您查看相关文档。
ZeyuTeng96 commented 9 months ago
  1. 没尝试过,不确定是否可行并可用。
  2. 两个方法本质上是等价的,可以查看接口文档确定使用方法。tokenizer.add_special_tokens({'additional_special_tokens': ['<|User|>', '<|Assistant|>', '<|System|>']})可以在加载tokenizer后使用。
  3. 训练sp model时我们基本用的都是默认参数,所以user_defined_symbols的作用还需您查看相关文档。

所以这边的chinese llama就是正常的进行词表扩充,没有添加额外的special token进行预训练。然后,在sft chinese alpaca的时候,用tokenizer.add_special_tokens进行添加special token嘛?

iMountTai commented 9 months ago

二代llama/alpaca是在PT之前扩充词表的,扩充词表后,PT阶段或者SFT阶段都没有做额外的词表扩充。

ZeyuTeng96 commented 9 months ago

二代llama/alpaca是在PT之前扩充词表的,扩充词表后,PT阶段或者SFT阶段都没有做额外的词表扩充。

一代是在sft alpaca的时候有添加special token嘛?我记得好像是有这个操作的

iMountTai commented 9 months ago

是的,一代llama SFT阶段添加了pad。

github-actions[bot] commented 8 months ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your consideration.

github-actions[bot] commented 8 months ago

Closing the issue, since no updates observed. Feel free to re-open if you need any further assistance.