国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

怎么讓英文大預(yù)言模型支持中文?(一)構(gòu)建自己的tokenization

這篇具有很好參考價(jià)值的文章主要介紹了怎么讓英文大預(yù)言模型支持中文?(一)構(gòu)建自己的tokenization。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

代碼地址:https://github.com/taishan1994/sentencepiece_chinese_bpe

Part1前言

目前,大語(yǔ)言模型呈爆發(fā)式的增長(zhǎng),其中,基于llama家族的模型占據(jù)了半壁江山。而原始的llama模型對(duì)中文的支持不太友好,接下來(lái)本文將講解如何去擴(kuò)充vocab里面的詞以對(duì)中文進(jìn)行token化。

Part2數(shù)據(jù)預(yù)處理

對(duì)斗破蒼穹語(yǔ)料進(jìn)行預(yù)處理,每一行為一句或多句話。

with?open("data/《斗破蒼穹》.txt",?"r",?encoding="utf-8")?as?fp:
????data?=?fp.read().strip().split("\n")
sentences?=?[]

for?d?in?data:
????d?=?d.strip()
????if?"==="?in?d?or?len(d)?==?0?or?d?==?"《斗破蒼穹》來(lái)自:":
????????continue
????sentences.append(d)

with?open("data/corpus.txt",?"w",?encoding="utf-8")?as?fp:
????fp.write("\n".join(sentences))

最終得到corpus.txt。

Part3sentencepiece

首先,我們需要去構(gòu)建中文的詞庫(kù)。一般的,目前比較主流的是使用sentencepiece訓(xùn)練中文詞庫(kù)。安裝指令也很簡(jiǎn)單:pip install sentencepiece。然后,我們準(zhǔn)備好語(yǔ)料,這里我們使用的語(yǔ)料是斗破蒼穹小說(shuō)。

直接看代碼:

import?sentencepiece?as?spm
spm.SentencePieceTrainer.train(
????input='data/corpus.txt',
????model_prefix='tokenizer',
????vocab_size=50000,
????user_defined_symbols=['foo',?'bar'],
????character_coverage=1.0,
????model_type="bpe",
)

這里講下每個(gè)參數(shù)的作用:

  • input:指定輸入文本文件的路徑或者是一個(gè)目錄,可以指定多個(gè)輸入文件或目錄。其中每一行可以是一句話或者多句話。
  • tokenizer:保存的模型的名稱前綴。
  • vocab_size:設(shè)置的詞表大小。
  • user_defined_symbols:用于指定用戶自定義的符號(hào)。這些符號(hào)將會(huì)被視為單獨(dú)的 Token,不會(huì)被拆分成子詞。這個(gè)參數(shù)的作用是將一些用戶定義的特殊符號(hào)作為一個(gè)整體加入到生成的詞表中,以便于后續(xù)的模型使用。這里我們簡(jiǎn)單進(jìn)行了測(cè)試。
  • model_type: 指定模型的類(lèi)型,有三種可選參數(shù):unigram, bpe, char. word。
  • character_coverage指定覆蓋字符的數(shù)量,可以理解為限制字符集的大小。默認(rèn)值為 1.0,即覆蓋全部字符。
  • unk_id: 指定未登錄詞的 ID 號(hào),即在詞表中為未登錄詞分配一個(gè)整數(shù) ID。默認(rèn)值為 0。
  • bos_id: 指定句子開(kāi)頭符號(hào)的 ID 號(hào),即在詞表中為句子開(kāi)頭符號(hào)分配一個(gè)整數(shù) ID。默認(rèn)值為 1。
  • eos_id: 指定句子結(jié)束符號(hào)的 ID 號(hào),即在詞表中為句子結(jié)束符號(hào)分配一個(gè)整數(shù) ID。默認(rèn)值為 2。
  • pad_id: 指定填充符號(hào)的 ID 號(hào),即在詞表中為填充符號(hào)分配一個(gè)整數(shù) ID。默認(rèn)值為 -1,即不使用填充符號(hào)。

運(yùn)行后會(huì)得到tokenizer.model和tokenizer.vocab兩個(gè)文件。

我們來(lái)看看tokenizer.vocab里面是什么:

<unk>?0
<s>?0
</s>?0
foo?0
bar?0
蕭炎?-0
..?-1
▁“?-2
也是?-3
便是?-4
了一?-5
。”?-6

除了一些特殊符號(hào)外,還有我們自定義的foo和bar,其余的一些詞是BPE訓(xùn)練得到,具體什么是BPE算法這里不作展開(kāi)了。

Part4怎么使用transformers庫(kù)加載sentencepiece模型

直接看代碼:

import?os

os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"]?=?"python"
from?transformers?import?LlamaTokenizer
from?sentencepiece?import?sentencepiece_model_pb2?as?sp_pb2_model
import?sentencepiece?as?spm
from?tokenization?import?ChineseTokenizer

chinese_sp_model_file?=?"sentencepisece_tokenizer/tokenizer.model"

#?load
chinese_sp_model?=?spm.SentencePieceProcessor()
chinese_sp_model.Load(chinese_sp_model_file)

chinese_spm?=?sp_pb2_model.ModelProto()
chinese_spm.ParseFromString(chinese_sp_model.serialized_model_proto())

##?Save
output_dir?=?'./transformers_tokenizer/chinese/'
os.makedirs(output_dir,?exist_ok=True)
with?open(output_dir?+?'chinese.model',?'wb')?as?f:
????f.write(chinese_spm.SerializeToString())
tokenizer?=?ChineseTokenizer(vocab_file=output_dir?+?'chinese.model')

tokenizer.save_pretrained(output_dir)
print(f"Chinese?tokenizer?has?been?saved?to?{output_dir}")

#?Test
chinese_tokenizer?=?ChineseTokenizer.from_pretrained(output_dir)
print(tokenizer.all_special_tokens)
print(tokenizer.all_special_ids)
print(tokenizer.special_tokens_map)
text?=?'''白日依山盡,黃河入海流。欲窮千里目,更上一層樓。
The?primary?use?of?LLaMA?is?research?on?large?language?models,?including'''

print("Test?text:\n",?text)
print(f"Tokenized?by?Chinese-LLaMA?tokenizer:{chinese_tokenizer.tokenize(text)}")

結(jié)果:

Chinese?tokenizer?has?been?saved?to?./transformers_tokenizer/chinese/
['<s>',?'</s>',?'<unk>']
[1,?2,?0]
{'bos_token':?'<s>',?'eos_token':?'</s>',?'unk_token':?'<unk>'}
Test?text:
?白日依山盡,黃河入海流。欲窮千里目,更上一層樓。
The?primary?use?of?LLaMA?is?research?on?large?language?models,?including
Tokenized?by?Chinese-LLaMA?tokenizer:['▁',?'白日',?'依',?'山',?'盡',?',',?'黃',?'河',?'入',?'海',?'流',?'。',?'欲',?'窮',?'千里',?'目',?',',?'更',?'上一層',?'樓',?'。',?'▁',?'T',?'h',?'e',?'▁',?'p',?'r',?'i',?'m',?'a',?'r',?'y',?'▁',?'u',?'s',?'e',?'▁',?'o',?'f',?'▁',?'LL',?'a',?'MA',?'▁i',?'s',?'▁',?'r',?'e',?'s',?'e',?'a',?'r',?'ch',?'▁',?'o',?'n',?'▁',?'l',?'a',?'r',?'g',?'e',?'▁',?'l',?'an',?'g',?'u',?'a',?'g',?'e',?'▁',?'m',?'o',?'d',?'e',?'l',?'s',?',',?'▁i',?'n',?'c',?'lu',?'d',?'i',?'ng']

其中ChineseTokenizer這里參考了llama模型里面使用的方法,并稍微做些修改:

#?coding=utf-8
#?Copyright?2022?EleutherAI?and?the?HuggingFace?Inc.?team.?All?rights?reserved.
#
#?This?code?is?based?on?EleutherAI's?GPT-NeoX?library?and?the?GPT-NeoX
#?and?OPT?implementations?in?this?library.?It?has?been?modified?from?its
#?original?forms?to?accommodate?minor?architectural?differences?compared
#?to?GPT-NeoX?and?OPT?used?by?the?Meta?AI?team?that?trained?the?model.
#
#?Licensed?under?the?Apache?License,?Version?2.0?(the?"License");
#?you?may?not?use?this?file?except?in?compliance?with?the?License.
#?You?may?obtain?a?copy?of?the?License?at
#
#?????http://www.apache.org/licenses/LICENSE-2.0
#
#?Unless?required?by?applicable?law?or?agreed?to?in?writing,?software
#?distributed?under?the?License?is?distributed?on?an?"AS?IS"?BASIS,
#?WITHOUT?WARRANTIES?OR?CONDITIONS?OF?ANY?KIND,?either?express?or?implied.
#?See?the?License?for?the?specific?language?governing?permissions?and
#?limitations?under?the?License.

"""Tokenization?classes?for?LLaMA."""
import?os
from?shutil?import?copyfile
from?typing?import?Any,?Dict,?List,?Optional,?Tuple

import?sentencepiece?as?spm

from?transformers.tokenization_utils?import?AddedToken,?PreTrainedTokenizer
from?transformers.utils?import?logging


logger?=?logging.get_logger(__name__)

VOCAB_FILES_NAMES?=?{"vocab_file":?"tokenizer.model"}

#?PRETRAINED_VOCAB_FILES_MAP?=?{
#?????"vocab_file":?{
#?????????"hf-internal-testing/llama-tokenizer":?"https://huggingface.co/hf-internal-testing/llama-tokenizer/resolve/main/tokenizer.model",
#?????},
#?????"tokenizer_file":?{
#?????????"hf-internal-testing/llama-tokenizer":?"https://huggingface.co/hf-internal-testing/llama-tokenizer/resolve/main/tokenizer_config.json",
#?????},
#?}
#?PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES?=?{
#?????"hf-internal-testing/llama-tokenizer":?2048,
#?}


class?ChineseTokenizer(PreTrainedTokenizer):
????"""
????Construct?a?Llama?tokenizer.?Based?on?byte-level?Byte-Pair-Encoding.

????Args:
????????vocab_file?(`str`):
????????????Path?to?the?vocabulary?file.
????"""


????vocab_files_names?=?VOCAB_FILES_NAMES
????#?pretrained_vocab_files_map?=?PRETRAINED_VOCAB_FILES_MAP
????#?max_model_input_sizes?=?PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
????model_input_names?=?["input_ids",?"attention_mask"]

????def?__init__(
????????self,
????????vocab_file,
????????unk_token="<unk>",
????????bos_token="<s>",
????????eos_token="</s>",
????????pad_token=None,
????????sp_model_kwargs:?Optional[Dict[str,?Any]]?=?None,
????????add_bos_token=True,
????????add_eos_token=False,
????????clean_up_tokenization_spaces=False,
????????**kwargs,
????)
:

????????self.sp_model_kwargs?=?{}?if?sp_model_kwargs?is?None?else?sp_model_kwargs
????????bos_token?=?AddedToken(bos_token,?lstrip=False,?rstrip=False)?if?isinstance(bos_token,?str)?else?bos_token
????????eos_token?=?AddedToken(eos_token,?lstrip=False,?rstrip=False)?if?isinstance(eos_token,?str)?else?eos_token
????????unk_token?=?AddedToken(unk_token,?lstrip=False,?rstrip=False)?if?isinstance(unk_token,?str)?else?unk_token
????????pad_token?=?AddedToken(pad_token,?lstrip=False,?rstrip=False)?if?isinstance(pad_token,?str)?else?pad_token
????????super().__init__(
????????????bos_token=bos_token,
????????????eos_token=eos_token,
????????????unk_token=unk_token,
????????????pad_token=pad_token,
????????????add_bos_token=add_bos_token,
????????????add_eos_token=add_eos_token,
????????????sp_model_kwargs=self.sp_model_kwargs,
????????????clean_up_tokenization_spaces=clean_up_tokenization_spaces,
????????????**kwargs,
????????)
????????self.vocab_file?=?vocab_file
????????self.add_bos_token?=?add_bos_token
????????self.add_eos_token?=?add_eos_token
????????self.sp_model?=?spm.SentencePieceProcessor(**self.sp_model_kwargs)
????????self.sp_model.Load(vocab_file)

????def?__getstate__(self):
????????state?=?self.__dict__.copy()
????????state["sp_model"]?=?None
????????return?state

????def?__setstate__(self,?d):
????????self.__dict__?=?d
????????self.sp_model?=?spm.SentencePieceProcessor(**self.sp_model_kwargs)
????????self.sp_model.Load(self.vocab_file)

????@property
????def?vocab_size(self):
????????"""Returns?vocab?size"""
????????return?self.sp_model.get_piece_size()

????def?get_vocab(self):
????????"""Returns?vocab?as?a?dict"""
????????vocab?=?{self.convert_ids_to_tokens(i):?i?for?i?in?range(self.vocab_size)}
????????vocab.update(self.added_tokens_encoder)
????????return?vocab

????def?_tokenize(self,?text):
????????"""Returns?a?tokenized?string."""
????????return?self.sp_model.encode(text,?out_type=str)

????def?_convert_token_to_id(self,?token):
????????"""Converts?a?token?(str)?in?an?id?using?the?vocab."""
????????return?self.sp_model.piece_to_id(token)

????def?_convert_id_to_token(self,?index):
????????"""Converts?an?index?(integer)?in?a?token?(str)?using?the?vocab."""
????????token?=?self.sp_model.IdToPiece(index)
????????return?token

????def?convert_tokens_to_string(self,?tokens):
????????"""Converts?a?sequence?of?tokens?(string)?in?a?single?string."""
????????current_sub_tokens?=?[]
????????out_string?=?""
????????prev_is_special?=?False
????????for?i,?token?in?enumerate(tokens):
????????????#?make?sure?that?special?tokens?are?not?decoded?using?sentencepiece?model
????????????if?token?in?self.all_special_tokens:
????????????????if?not?prev_is_special?and?i?!=?0:
????????????????????out_string?+=?"?"
????????????????out_string?+=?self.sp_model.decode(current_sub_tokens)?+?token
????????????????prev_is_special?=?True
????????????????current_sub_tokens?=?[]
????????????else:
????????????????current_sub_tokens.append(token)
????????????????prev_is_special?=?False
????????out_string?+=?self.sp_model.decode(current_sub_tokens)
????????return?out_string

????def?save_vocabulary(self,?save_directory,?filename_prefix:?Optional[str]?=?None)?->?Tuple[str]:
????????"""
????????Save?the?vocabulary?and?special?tokens?file?to?a?directory.

????????Args:
????????????save_directory?(`str`):
????????????????The?directory?in?which?to?save?the?vocabulary.

????????Returns:
????????????`Tuple(str)`:?Paths?to?the?files?saved.
????????"""

????????if?not?os.path.isdir(save_directory):
????????????logger.error(f"Vocabulary?path?({save_directory})?should?be?a?directory")
????????????return
????????out_vocab_file?=?os.path.join(
????????????save_directory,?(filename_prefix?+?"-"?if?filename_prefix?else?"")?+?VOCAB_FILES_NAMES["vocab_file"]
????????)

????????if?os.path.abspath(self.vocab_file)?!=?os.path.abspath(out_vocab_file)?and?os.path.isfile(self.vocab_file):
????????????copyfile(self.vocab_file,?out_vocab_file)
????????elif?not?os.path.isfile(self.vocab_file):
????????????with?open(out_vocab_file,?"wb")?as?fi:
????????????????content_spiece_model?=?self.sp_model.serialized_model_proto()
????????????????fi.write(content_spiece_model)

????????return?(out_vocab_file,)

????def?build_inputs_with_special_tokens(self,?token_ids_0,?token_ids_1=None):
????????bos_token_id?=?[self.bos_token_id]?if?self.add_bos_token?else?[]
????????eos_token_id?=?[self.eos_token_id]?if?self.add_eos_token?else?[]

????????output?=?bos_token_id?+?token_ids_0?+?eos_token_id

????????if?token_ids_1?is?not?None:
????????????output?=?output?+?bos_token_id?+?token_ids_1?+?eos_token_id

????????return?output

????def?get_special_tokens_mask(
????????self,?token_ids_0:?List[int],?token_ids_1:?Optional[List[int]]?=?None,?already_has_special_tokens:?bool?=?False
????)
?->?List[int]:

????????"""
????????Retrieve?sequence?ids?from?a?token?list?that?has?no?special?tokens?added.?This?method?is?called?when?adding
????????special?tokens?using?the?tokenizer?`prepare_for_model`?method.

????????Args:
????????????token_ids_0?(`List[int]`):
????????????????List?of?IDs.
????????????token_ids_1?(`List[int]`,?*optional*):
????????????????Optional?second?list?of?IDs?for?sequence?pairs.
????????????already_has_special_tokens?(`bool`,?*optional*,?defaults?to?`False`):
????????????????Whether?or?not?the?token?list?is?already?formatted?with?special?tokens?for?the?model.

????????Returns:
????????????`List[int]`:?A?list?of?integers?in?the?range?[0,?1]:?1?for?a?special?token,?0?for?a?sequence?token.
????????"""

????????if?already_has_special_tokens:
????????????return?super().get_special_tokens_mask(
????????????????token_ids_0=token_ids_0,?token_ids_1=token_ids_1,?already_has_special_tokens=True
????????????)

????????bos_token_id?=?[1]?if?self.add_bos_token?else?[]
????????eos_token_id?=?[1]?if?self.add_eos_token?else?[]

????????if?token_ids_1?is?None:
????????????return?bos_token_id?+?([0]?*?len(token_ids_0))?+?eos_token_id
????????return?(
????????????bos_token_id
????????????+?([0]?*?len(token_ids_0))
????????????+?eos_token_id
????????????+?bos_token_id
????????????+?([0]?*?len(token_ids_1))
????????????+?eos_token_id
????????)

????def?create_token_type_ids_from_sequences(
????????self,?token_ids_0:?List[int],?token_ids_1:?Optional[List[int]]?=?None
????)
?->?List[int]:

????????"""
????????Creates?a?mask?from?the?two?sequences?passed?to?be?used?in?a?sequence-pair?classification?task.?An?ALBERT
????????sequence?pair?mask?has?the?following?format:

????????```
????????0?0?0?0?0?0?0?0?0?0?0?1?1?1?1?1?1?1?1?1
????????|?first?sequence????|?second?sequence?|
????????```

????????if?token_ids_1?is?None,?only?returns?the?first?portion?of?the?mask?(0s).

????????Args:
????????????token_ids_0?(`List[int]`):
????????????????List?of?ids.
????????????token_ids_1?(`List[int]`,?*optional*):
????????????????Optional?second?list?of?IDs?for?sequence?pairs.

????????Returns:
????????????`List[int]`:?List?of?[token?type?IDs](../glossary#token-type-ids)?according?to?the?given?sequence(s).
????????"""

????????bos_token_id?=?[self.bos_token_id]?if?self.add_bos_token?else?[]
????????eos_token_id?=?[self.eos_token_id]?if?self.add_eos_token?else?[]

????????output?=?[0]?*?len(bos_token_id?+?token_ids_0?+?eos_token_id)

????????if?token_ids_1?is?not?None:
????????????output?+=?[1]?*?len(bos_token_id?+?token_ids_1?+?eos_token_id)

????????return?output

不難發(fā)現(xiàn)其實(shí)里面使用了一些sentencepiece里面的函數(shù)。

Part5怎么合并英文詞表和中文詞表?

直接看代碼:

import?os

os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"]?=?"python"
from?transformers?import?LlamaTokenizer
from?sentencepiece?import?sentencepiece_model_pb2?as?sp_pb2_model
import?sentencepiece?as?spm

llama_tokenizer_dir?=?"transformers_tokenizer/llama/tokenizer.model"
chinese_sp_model_file?=?"sentencepisece_tokenizer/tokenizer.model"

#?load
llama_tokenizer?=?LlamaTokenizer.from_pretrained(llama_tokenizer_dir)
chinese_sp_model?=?spm.SentencePieceProcessor()
chinese_sp_model.Load(chinese_sp_model_file)

llama_spm?=?sp_pb2_model.ModelProto()
llama_spm.ParseFromString(llama_tokenizer.sp_model.serialized_model_proto())
chinese_spm?=?sp_pb2_model.ModelProto()
chinese_spm.ParseFromString(chinese_sp_model.serialized_model_proto())

#?print?number?of?tokens
print(len(llama_tokenizer),?len(chinese_sp_model))
print(llama_tokenizer.all_special_tokens)
print(llama_tokenizer.all_special_ids)
print(llama_tokenizer.special_tokens_map)

##?Add?Chinese?tokens?to?LLaMA?tokenizer
llama_spm_tokens_set?=?set(p.piece?for?p?in?llama_spm.pieces)
print(len(llama_spm_tokens_set))
print(f"Before:{len(llama_spm_tokens_set)}")
for?p?in?chinese_spm.pieces:
????piece?=?p.piece
????if?piece?not?in?llama_spm_tokens_set:
????????new_p?=?sp_pb2_model.ModelProto().SentencePiece()
????????new_p.piece?=?piece
????????new_p.score?=?0
????????llama_spm.pieces.append(new_p)
print(f"New?model?pieces:?{len(llama_spm.pieces)}")

##?Save
output_sp_dir?=?'transformers_tokenizer/llama_chinese'
output_hf_dir?=?'transformers_tokenizer/llama_chinese'??#?the?path?to?save?Chinese-LLaMA?tokenizer
os.makedirs(output_sp_dir,?exist_ok=True)
with?open(output_sp_dir?+?'/chinese_llama.model',?'wb')?as?f:
????f.write(llama_spm.SerializeToString())
tokenizer?=?LlamaTokenizer(vocab_file=output_sp_dir?+?'/chinese_llama.model')

tokenizer.save_pretrained(output_hf_dir)
print(f"Chinese-LLaMA?tokenizer?has?been?saved?to?{output_hf_dir}")

#?Test
llama_tokenizer?=?LlamaTokenizer.from_pretrained(llama_tokenizer_dir)
chinese_llama_tokenizer?=?LlamaTokenizer.from_pretrained(output_hf_dir)
print(tokenizer.all_special_tokens)
print(tokenizer.all_special_ids)
print(tokenizer.special_tokens_map)
text?=?'''白日依山盡,黃河入海流。欲窮千里目,更上一層樓。
The?primary?use?of?LLaMA?is?research?on?large?language?models,?including'''

print("Test?text:\n",?text)
print(f"Tokenized?by?LLaMA?tokenizer:{llama_tokenizer.tokenize(text)}")
print(f"Tokenized?by?Chinese-LLaMA?tokenizer:{chinese_llama_tokenizer.tokenize(text)}")

核心部分是這一塊:

for?p?in?chinese_spm.pieces:
????piece?=?p.piece
????if?piece?not?in?llama_spm_tokens_set:
????????new_p?=?sp_pb2_model.ModelProto().SentencePiece()
????????new_p.piece?=?piece
????????new_p.score?=?0
????????llama_spm.pieces.append(new_p)

也就是將原始詞表中沒(méi)有的新加入進(jìn)去。

最后看一下結(jié)果:

32000?50000
['<s>',?'</s>',?'<unk>']
[1,?2,?0]
{'bos_token':?'<s>',?'eos_token':?'</s>',?'unk_token':?'<unk>'}
32000
Before:32000
New?model?pieces:?81163
Chinese-LLaMA?tokenizer?has?been?saved?to?transformers_tokenizer/llama_chinese
['<s>',?'</s>',?'<unk>']
[1,?2,?0]
{'bos_token':?'<s>',?'eos_token':?'</s>',?'unk_token':?'<unk>'}
Test?text:
?白日依山盡,黃河入海流。欲窮千里目,更上一層樓。
The?primary?use?of?LLaMA?is?research?on?large?language?models,?including
Tokenized?by?LLaMA?tokenizer:['▁',?'白',?'日',?'<0xE4>',?'<0xBE>',?'<0x9D>',?'山',?'<0xE5>',?'<0xB0>',?'<0xBD>',?',',?'黃',?'河',?'入',?'海',?'流',?'。',?'<0xE6>',?'<0xAC>',?'<0xB2>',?'<0xE7>',?'<0xA9>',?'<0xB7>',?'千',?'里',?'目',?',',?'更',?'上',?'一',?'<0xE5>',?'<0xB1>',?'<0x82>',?'<0xE6>',?'<0xA5>',?'<0xBC>',?'。',?'<0x0A>',?'The',?'▁primary',?'▁use',?'▁of',?'▁L',?'La',?'MA',?'▁is',?'▁research',?'▁on',?'▁large',?'▁language',?'▁models',?',',?'▁including']
Tokenized?by?Chinese-LLaMA?tokenizer:['▁白',?'日',?'依',?'山',?'盡',?',',?'黃',?'河',?'入',?'海',?'流',?'。',?'欲',?'窮',?'千里',?'目',?',',?'更',?'上一層',?'樓',?'。',?'<0x0A>',?'The',?'▁primary',?'▁use',?'▁of',?'▁L',?'La',?'MA',?'▁is',?'▁research',?'▁on',?'▁large',?'▁language',?'▁models',?',',?'▁including']

會(huì)發(fā)現(xiàn)再加入了我們定義的詞表后確實(shí)能夠?qū)χ形倪M(jìn)行分詞了。

Part6怎么使用修改后的詞表?

如果我們重新從頭開(kāi)始訓(xùn)練,那么其實(shí)使用起來(lái)很簡(jiǎn)單:

config?=?AutoConfig.from_pretrained(...)
tokenizer?=?LlamaTokenizer.from_pretrained(...)
model?=?LlamaForCausalLM.from_pretrained(...,?config=config)
model_vocab_size?=?model.get_output_embeddings().weight.size(0)
model.resize_token_embeddings(len(tokenizer))

但是如果我們想要保留原始模型embedding的參數(shù),那么我們可以這么做:

  • 1、找到新詞表和舊詞表id之間的映射關(guān)系。
  • 2、將模型里面新詞表里面包含的舊詞表用原始模型的embedding替換。
  • 3、如果新詞在舊詞表里面沒(méi)有出現(xiàn)就進(jìn)行相應(yīng)的初始化再進(jìn)行賦值。比如transformers庫(kù)中的llama是這么進(jìn)行初始化的:
?def?_init_weights(self,?module):
????????std?=?self.config.initializer_range
????????if?isinstance(module,?nn.Linear):
????????????module.weight.data.normal_(mean=0.0,?std=std)
????????????if?module.bias?is?not?None:
????????????????module.bias.data.zero_()
????????elif?isinstance(module,?nn.Embedding):
????????????module.weight.data.normal_(mean=0.0,?std=std)
????????????if?module.padding_idx?is?not?None:
????????????????module.weight.data[module.padding_idx].zero_()

具體怎么做可以參考一下這個(gè):https://github.com/yangjianxin1/LLMPruner

Part7總結(jié)

到這里為止,我們已經(jīng)學(xué)會(huì)了:

  • 1、使用sentencepiece訓(xùn)練一個(gè)中文的詞表。
  • 2、使用transformers加載sentencepiece模型。
  • 3、怎么合并中英文的詞表,并使用transformers使用合并后的詞表。
  • 4、在模型中怎么使用新詞表。

Part8參考

https://github.com/ymcui/Chinese-LLaMA-Alpaca

https://github.com/yangjianxin1/LLMPruner

https://github.com/huggingface/transformers文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-497876.html

到了這里,關(guān)于怎么讓英文大預(yù)言模型支持中文?(一)構(gòu)建自己的tokenization的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 簡(jiǎn)單的手機(jī)記事本怎么把英文翻譯成中文?

    簡(jiǎn)單的手機(jī)記事本怎么把英文翻譯成中文?

    手機(jī)記事本是人們常用的輔助工具之一,在使用手機(jī)記事本記錄內(nèi)容的時(shí)候,除了我們平時(shí)使用較多的中文之外,也有人會(huì)記錄一些英文內(nèi)容。想要將手機(jī)記事本中的英文內(nèi)容翻譯成中文內(nèi)容應(yīng)該如何操作呢?以iPhone手機(jī)端敬業(yè)簽記事本軟件為例: 1、打開(kāi)iPhone手機(jī)上的敬業(yè)

    2024年02月16日
    瀏覽(62)
  • NeMo中文/英文ASR模型微調(diào)訓(xùn)練實(shí)踐

    1.安裝nemo pip install -U nemo_toolkit[all] ASR-metrics 2.下載ASR預(yù)訓(xùn)練模型到本地(建議使用huggleface,比nvidia官網(wǎng)快很多) 3.從本地創(chuàng)建ASR模型 asr_model = nemo_asr.models.EncDecCTCModel.restore_from(\\\"stt_zh_quartznet15x5.nemo\\\") 3.定義train_mainfest,包含語(yǔ)音文件路徑、時(shí)長(zhǎng)和語(yǔ)音文本的json文件 4.讀取模型的

    2024年02月13日
    瀏覽(20)
  • VSCode怎么設(shè)置成中文_2種方法讓你告別英文困擾

    VSCode怎么設(shè)置成中文_2種方法讓你告別英文困擾

    ?VSCode設(shè)置成中文的教程分享 ??方法一: ??1.我們打開(kāi)軟件,然后在軟件左側(cè)工具欄里找到應(yīng)用這一選項(xiàng)。 ??2.我們點(diǎn)擊應(yīng)用選項(xiàng),然后在上方的搜索欄中輸入“Chinese?(Simplified)?Language?Pack?for?Visual?Studio?Code”,然后再點(diǎn)擊回車(chē)鍵。 ??3.這時(shí)就會(huì)出現(xiàn)各種語(yǔ)

    2024年04月23日
    瀏覽(31)
  • 本地構(gòu)建自己的chatgpt已成為可能,國(guó)外團(tuán)隊(duì)從GPT3.5提取大規(guī)模數(shù)據(jù)完成本地機(jī)器人訓(xùn)練,并開(kāi)源項(xiàng)目源碼和模型支持普通在筆記上運(yùn)行chatgpt

    本地構(gòu)建自己的chatgpt已成為可能,國(guó)外團(tuán)隊(duì)從GPT3.5提取大規(guī)模數(shù)據(jù)完成本地機(jī)器人訓(xùn)練,并開(kāi)源項(xiàng)目源碼和模型支持普通在筆記上運(yùn)行chatgpt

    國(guó)外團(tuán)隊(duì)從GPT3.5提取大規(guī)模數(shù)據(jù)完成本地機(jī)器人訓(xùn)練,并開(kāi)源項(xiàng)目源碼和模型支持,普通在筆記上運(yùn)行chatgpt。下面是他們分享的:收集到的數(shù)據(jù)、數(shù)據(jù)管理程序、訓(xùn)練代碼和最終模型,以促進(jìn)開(kāi)放研究和可重復(fù)性。 在 2023 年 3 月 20 日至 2023 年 3 月 26 日期間,該團(tuán)隊(duì)使用 GPT

    2023年04月21日
    瀏覽(100)
  • Baichuan-13B:130億參數(shù)的開(kāi)源語(yǔ)言模型,引領(lǐng)中文和英文benchmark

    Baichuan-13B:130億參數(shù)的開(kāi)源語(yǔ)言模型,引領(lǐng)中文和英文benchmark

    Baichuan-13B: 一個(gè)強(qiáng)大的開(kāi)源大規(guī)模語(yǔ)言模型 標(biāo)題:Baichuan-13B:130億參數(shù)的開(kāi)源語(yǔ)言模型,引領(lǐng)中文和英文benchmark Baichuan-13B是由百川智能開(kāi)發(fā)的一個(gè)開(kāi)源大規(guī)模語(yǔ)言模型項(xiàng)目,包含了130億參數(shù)。該模型在中文和英文的權(quán)威benchmark上達(dá)到了同尺寸模型的最佳效果。這個(gè)項(xiàng)目發(fā)布了

    2024年02月16日
    瀏覽(30)
  • 已經(jīng)開(kāi)源的中文大模型對(duì)比,支持更新

    大模型對(duì)比網(wǎng)站:大模型綜合評(píng)測(cè)對(duì)比 | 當(dāng)前主流大模型在各評(píng)測(cè)數(shù)據(jù)集上的表現(xiàn)總榜單 | 數(shù)據(jù)學(xué)習(xí) (DataLearner) 大模型下載:互鏈高科 ClueAI/PromptCLUE-base-v1-5 at main (huggingface.co) 支持多任務(wù)生成,支持中文,不支持多輪對(duì)話,體驗(yàn):ClueAI (cluebenchmarks.com) 基于promptclue-base進(jìn)一步訓(xùn)

    2024年02月12日
    瀏覽(23)
  • 構(gòu)建自己的ChatGPT:從零開(kāi)始構(gòu)建個(gè)性化語(yǔ)言模型

    構(gòu)建自己的ChatGPT:從零開(kāi)始構(gòu)建個(gè)性化語(yǔ)言模型

    ???? 博主 libin9iOak帶您 Go to New World.??? ?? 個(gè)人主頁(yè)——libin9iOak的博客?? ?? 《面試題大全》 文章圖文并茂??生動(dòng)形象??簡(jiǎn)單易學(xué)!歡迎大家來(lái)踩踩~?? ?? 《IDEA開(kāi)發(fā)秘籍》學(xué)會(huì)IDEA常用操作,工作效率翻倍~?? ???? 希望本文能夠給您帶來(lái)一定的幫助??文章粗淺,敬

    2024年02月15日
    瀏覽(28)
  • 從0開(kāi)始構(gòu)建自己的AI大模型

    在過(guò)去的幾年里,人工智能(AI)技術(shù)取得了巨大的進(jìn)步,這主要是由于深度學(xué)習(xí)(Deep Learning)技術(shù)的迅速發(fā)展。深度學(xué)習(xí)是一種通過(guò)神經(jīng)網(wǎng)絡(luò)模擬人類(lèi)大腦的學(xué)習(xí)過(guò)程來(lái)自動(dòng)學(xué)習(xí)和預(yù)測(cè)的技術(shù)。隨著數(shù)據(jù)規(guī)模的增加和計(jì)算能力的提高,深度學(xué)習(xí)已經(jīng)取得了在圖像識(shí)別、語(yǔ)音

    2024年02月20日
    瀏覽(19)
  • 最新開(kāi)源!更擅長(zhǎng)推理的LLaMA大模型,支持中文

    最新開(kāi)源!更擅長(zhǎng)推理的LLaMA大模型,支持中文

    ?PaperWeekly 原創(chuàng) ·?作者 |? 李忠利 研究方向 |? 自然語(yǔ)言處理 跟大家介紹一下自己最近訓(xùn)練的 LLaMA 模型——BiLLa: A?Bilingual?LLaMA with Enhanced Reasoning Ability. Github 地址:? https://github.com/Neutralzz/BiLLa? HuggingFace 模型: ? https://huggingface.co/Neutralzz/BiLLa-7B-LLM(語(yǔ)言模型 BiLLa-7B-LLM)?

    2024年02月09日
    瀏覽(27)
  • 論文(3)——使用ChatGPT快速提高科研能力??!如何快速構(gòu)建代碼?怎么提高自己的科研能力?如何提高自己的生產(chǎn)力?

    論文(3)——使用ChatGPT快速提高科研能力!!如何快速構(gòu)建代碼?怎么提高自己的科研能力?如何提高自己的生產(chǎn)力?

    引言 chatGPT大模型用于問(wèn)問(wèn)題和debug,NewBing用于搜索論文,cpolit用于寫(xiě)代碼…各種各樣的工具層出不窮,之前因?yàn)檎n程和各種瑣事,也就胡亂接觸了一下,并沒(méi)有進(jìn)行系統(tǒng)性的總結(jié)。 這不,暑假要做系統(tǒng)性的科研了,也要好好寫(xiě)代碼了(之前也在好好寫(xiě)代碼),就需要好好總

    2024年02月16日
    瀏覽(31)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包