ããŒã¯ãã€ã¶ãŒæ§ç¯ã®ãã¬ããžãšããŒã ã®åãçµã¿ç޹ä»ãTeam Kumaã
ã¯ããã«
ã¯ãããŸããŠãGENIAC æŸå°Ÿç LLMéçºãããžã§ã¯ã Team Kuma ã®å®®æŸ€ãšç³ããŸãã
æ¬ãããžã§ã¯ãã«ã€ããŠã¯æ§ã ãªèšäºã§ç޹ä»ãããŠãããã詳现ã¯å²æããŸãããæ¬èšäºã¯5æäžæ¬ãŸã§ã®ãPhase1ãã®åãçµã¿ãããšã«æžãããã®ãšãªããŸãã
æ¬èšäºãå·çããŠããçŸåšã¯ãPhase2ãã®éçºæéããã§ã«çµäºããŠããŸããããPhase1ãã§ã®åããŒã ã®åãçµã¿ãçµæçºè¡šã¯ä»¥äžããèŠèŽããããšãã§ããŸãã
æ¬èšäºã®æŠèŠ
ç§ã¯Phase1ã®éçºã«ãŠãããŒã¯ãã€ã¶ãŒã®æ§ç¯ã»äºåŸåŠç¿ã»è©äŸ¡åšããæ åœããŠããŸãããä»åã¯ç¹ã«æéã䜿ã£ãŠãããããŒã¯ãã€ã¶ãŒã®æ§ç¯ãã«ã€ããŠã®ç¥èŠãå ±æããããšæããŸãã
ãã ããããŒã¯ãã€ã¶ãŒã®å·¥å€«ãçŽæ¥ã¢ãã«ã®ç²ŸåºŠã«å¯äžããŠããããæž¬å®ããããšã¯é£ããïŒäºååŠç¿ãäœåºŠã宿œããããšã¯ã§ããªãïŒãããããã§ã¯ããã®ããã«äœãã°ããïŒããšãããã¹ããã©ã¯ãã£ã¹ãææ¡ããã®ã§ã¯ãªã 1. ããŒã¯ãã€ã¶ãŒæ§ç¯ã®åãçµã¿ãéããŠåŠãã ããšã2. ããŒã ã§ã®åãçµã¿çŽ¹ä» ãšãã2ç¹ãè»žã«æžãããŠããã ããŸãã
ãããèžãŸããŠãæ¬èšäºã®æ³å®èªè ãšããŠã¯ãLLMãäºååŠç¿ãããŽãªãŽãªçµéšããããšã®ããæ¹ãšããããããLLMãäºååŠç¿ããéçºããããšã¯ãªããLLMãæ±ãæ©äŒãããæ¹ããããã¯ããŸã䜿ã£ãããšã¯ãªããèå³ãããæ¹ãšãããŠããã ããŸãã
1. ããŒã¯ãã€ã¶ãŒæ§ç¯ã®åãçµã¿ãéããŠåŠãã ããš
1-1. ãåºç€ç¥èãããŒã¯ãã€ã¶ãŒã«ã€ããŠ
ããŒã¯ãã€ã¶ãŒãšã¯
ããããããŒã¯ãã€ã¶ãŒãšã¯äœãã«ã€ããŠèª¬æããŠãããŸãã
ããŒã¯ãã€ã¶ãŒãšã¯ç«¯çã«èšãã°ãããã¹ããããŒã¯ã³åäœã§åå²ãããã®ãã§ããäŸãã°ãæ¬èšäºã®ã¿ã€ãã«ãããŒã¯ãã€ãºãããšã以äžã®ããã«ãªããŸãã
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("elyza/ELYZA-japanese-Llama-2-7b-fast")
print(tokenizer.tokenize("ããŒã¯ãã€ã¶ãŒæ§ç¯ã®ãã¬ããžãšããŒã ã®åãçµã¿ç޹ä»"))
# åºå
['â', 'ã', 'ãŒã¯', 'ã', 'ã€', 'ã¶ãŒ', 'æ§', 'ç¯', 'ã®', 'ã', 'ã¬ã', 'ãž', 'ãš', 'ããŒã ', 'ã®', 'åã', 'çµã¿', '玹ä»']
ããã§äžã®åå²çµæãèŠããšãããããã«ããããŒã¯ã³ããšã¯ãåèªã§ããªãæåã§ããªãåäœã§åºåãããŠããŸãããããã£ãŠãããŒã¯ãã€ã¶ãŒã®åŠç¿ãšã¯ãã©ã®ããã«ããã¹ããåå²ãããã®ã«ãŒã«æ±ºããã§ãããšèšãæããããšãã§ããŸãã
ãèªåœããšã¯
ããŒã¯ãã€ã¶ãŒãçè§£ããéã«å¿ ãåºãŠããã®ããèªåœãã§ããããã¯ãäžã§ç€ºãããããŒã¯ã³ããšããã«å¯ŸããIDãçŽä»ããèŸæžã®ãããªãã®ãæå³ããŸããäŸãã°ãelyza/ELYZA-japanese-Llama-2-7b-fastã®tokenizer.jsonãèŠãŠã¿ããšã以äžã®ããã«èªåœãèšå®ãããŠããŸãã
"<unk>": 0,
"<s>": 1,
"</s>": 2,
âŠ
"Price": 13026,
"antin": 13027,
"emento": 13028,
"may": 13029,
âŠ
"æ§": 36116,
âŠ
"玹ä»": 42858,
âŠ
å ã»ã©ããŒã¯ãã€ã¶ãŒã®åŠç¿ã¯ãã©ã®ããã«ããã¹ããåå²ãããã®ã«ãŒã«æ±ºãããšè¡šçŸããŸãããããã®éçšã®äžã€ãšããŠäžã®ãããªãèªåœããäœãããšãå«ãŸããŸãã
ããã§éèŠãªåºç€ç¥èãšããŠã¯ãããŒã¯ãã€ã¶ãŒã§ã¯èªåœã«èšå®ãããŠããããŒã¯ã³ã®ç²åºŠã§ããã¹ããåå²ããããšããããšã§ãã
å®éã«å ã»ã©ããã¹ããåå²ããã®ãšåãããŒã¯ãã€ã¶ãŒã䜿ã£ãŠãä»åºŠã¯ããã¹ããããŒã¯ã³åäœã«åºåã£ãŠIDã«ããããšã³ã³ãŒãããããŠã¿ãŸãã
print(tokenizer.encode("ããŒã¯ãã€ã¶ãŒæ§ç¯ã®ãã¬ããžãšããŒã ã®åãçµã¿ç޹ä»"))
åºåïŒ
[1, 29871, 30279, 43004, 30576, 30260, 43349, 36116, 37450, 30199, 30576, 44313, 30391, 30364, 43978, 30199, 42850, 43451, 42858]
ããã¹ããåå²ãããŠIDã«ãªããŸãããã玹ä»ããšããããŒã¯ã³ã«æ³šç®ãããšãèªåœã®äžã§ã¯ID:42858ã§ç»é²ãããŠãããå®éã«ããŒã¯ãã€ãºããã³ãšã³ã³ãŒããããæã«ã[玹,ä»]ã§ã¯ãªã[玹ä»]ãšããŠåå²ãããŠããããšãããããŸãã
代衚çãªã¢ã«ãŽãªãºã
ããŒã¯ãã€ã¶ãŒã§éèŠãªãèªåœãã«ã€ããŠçè§£ãããšããã§ãå®éã«ã©ã®ããã«ãã®èªåœãäœã£ãŠããã®ãïŒåŠç¿ããŠããã®ãïŒã«ã€ããŠç°¡åã«èª¬æããŠãããããšæããŸãã
ãã䜿ãããŠããã¢ã«ãŽãªãºã ãšããŠãBPE(Byte-Pair Encoding) ãš UnigramããããŸãã
BPE
ãã¡ãã¯ãæååäœã§ã®åå²ãããç¶æ ãã飿¥ããæåå士ãçµåããŠããããšã«ãã£ãŠè¡ãããããŒã¿å§çž®ã®ææ³ã®äžã€ã§ããBPEã§ã¯ãããã¹ãããã¹ãŠ1æååäœã«åå²ããŠãããé£ãåãæåã®é »åºŠãé«ããã®ãçµåããéçšãéããŠããã¹ãã®çµåã«ãŒã«ãäœããŸãã
äŸãã°ããããŒã¯ãã€ã¶ãŒãšã¢ãã©ã€ã¶ãŒã¯èªå°Ÿã䌌ãŠãããããšããããã¹ãããçµåã«ãŒã«ãäœãå Žåã以äžã®ããã«èããŸãã
æååäœã«åå²
ã ㌠㯠ã 〠㶠㌠㚠㢠ã ã© ã€ ã¶ ãŒ ã¯ èª å°Ÿ ã 䌌 ㊠ã ã ã
â
é£ãåãé »åºŠãé«ããã®ãçµåãã
ã ㌠㯠ã ã€ã¶ãŒ 㚠㢠ã ã© ã€ã¶ãŒ ã¯ èª å°Ÿ ã 䌌 ㊠ã ã ã
ããã§ã¯é£ãåãé »åºŠãé«ããã€ã¶ãŒããäžã€ã®ããŒã¯ã³ãšããŠäœãããŸããã
BPEã§ã¯ãã®ããã«ã飿¥ããé »åºŠãé«ãæåå士ãç¹ããããšã§ããŒã¯ã³ãäœã£ãŠãããŸããããã«ãã£ãŠèªåœã圢æããçµåã«ãŒã«ãåŠç¿ããŠãããŸãããŸããã©ã®ããããŸã§çµåãããã¯ãã€ããŒãã©ã¡ãŒã¿ã§èšå®ããããšãã§ããŸãã
å ã»ã©äŸã«æããelyza/ELYZA-japanese-Llama-2-7b-fastã®tokenizer.jsonãå床èŠããšã"vocab"ïŒèªåœïŒã®åŸã«"merges"ãšããçµåã«ãŒã«ã®èšå®ãæžãããŠããããšãããããŸãã
"merges": [
"â â",
"â t",
"e r",
"i n",
"â a",
"e n",
"o n",
"â th",
"ât h",
"e s",
âŠ
Unigram
Unigramã®ä»çµã¿ã¯BPEãšæ¯ã¹ããšå°ãè€éã§ãããããç°¡æœãªèª¬æã«ãšã©ããããŠããã ããŸããUnigramã«ããåŠç¿ããã»ã¹ã¯ãã£ãããããšãåãã«å€§ããªãµã€ãºã®èªåœãçšæããŠããããã®ããŒã¯ã³ã®ç起確çãèšç®ããEMã¢ã«ãŽãªãºã ãçšããŠããã¹ãåå²ã®å¯Ÿæ°å°€åºŠãé«ããªãããã«ãæå®ã®èªåœã®å€§ããã«ãªããŸã§ããŒã¯ã³ãçµã£ãŠããææ³ããšèšããããšæããŸãã
äŸãã°ãããåå²ãã¿ãŒã³ã«ãããŠãããããã¹ããããŒã¯ãã€ãºãããšãã®ããŒã¯ã³ã®ãªã¹ãã
ãã®æã®ããã¹ãåå²ïŒããŒã¯ãã€ãºïŒã«ããã察æ°å°€åºŠã¯
ãã®å¯Ÿæ°å°€åºŠãæå€§åãããããã«åŠç¿ããŠããŒã¯ã³ãšãã®ç起確çãããšã«èªåœãäœã£ãŠããã®ãUnigramã®ä»çµã¿ã§ãã
UnigramãçšããŠæ§ç¯ãããããŒã¯ãã€ã¶ãŒã䜿ã£ãŠããllm-jp/llm-jp-13b-v1.0ã®tokenizer.jsonãèŠããšã以äžã®ããã«èªåœã«ããŒã¯ã³ãšå¯Ÿæ°å°€åºŠãä¿åãããŠããããšãããããŸãã
âŠ
[
"read",
-9.904170036315918
],
[
"ctrl",
-11.401485443115234
],
[
"âreturns",
-11.236441612243652
],
âŠ
ãªãç®çã«é©ããããŒã¯ãã€ã¶ãŒãäœãã®ã
ããŒã¯ãã€ã¶ãŒã®åºç€ç¥èç·šã®æåŸã«ããLLMãéçºããäžã§ãªãããŒã¯ãã€ã¶ãŒãäœãããšãæ±ããããã®ããã説æããŠãããŸããããŒã¯ãã€ã¶ãŒã¯ããã¹ããåå²ããã ãã®ã·ã³ãã«ãªåœ¹å²ã«èŠããŸãããåçŽãªåèªåºåããæååºåãã«ã¯ãªãåªããç¹åŸŽããããŸãã
ãµãã¯ãŒãããŒã¯ã³åã«ããå¹çæ§
ãããŸã§ã«èª¬æããŠããŸããã§ããããããŒã¯ãã€ã¶ãŒã«é¢ããŠæŒãããã¹ãæŠå¿µãšããŠããµãã¯ãŒãããšãããã®ããããŸããããã¯ããŒã¯ãã€ã¶ãŒã§åå²ãããããŒã¯ã³ã®ããšã衚ããŸããäŸãã°ãunbelievableãšããåèªã¯['un', 'bel', 'iev', 'able']ãšåå²ãããŸããunã¯åŠå®ã®æå³ãæã£ãŠããããableã¯ãã§ããããšããæå³ãæã£ãŠãããããŸãããã®ããã«åºåãããããŒã¯ã³ãããµãã¯ãŒãããšåŒã¶ããšããããŸãã
ãã®ãããªåå²ã«ãã£ãŠãèªåœã«ç»é²ããããŒã¯ã³æ°ãç¯çŽããããšãã§ããŸããäŸãã°ãå
ã»ã©ã®'un', 'bel', 'iev', 'able'ãèªåœã«å«ãŸããŠããã°ãunableãšããããŒã¯ã³ãçŽæ¥èªåœã«å«ãŸããŠããªããŠãã['un', 'able']ãšããŒã¯ã³åããããšãã§ããŸãã
ããã¯èšãæãããšãèªåœã«å«ãŸããŠããªãæªç¥èªãžã®é©å¿æ§ãé«ããšãèšãæããããŸããæ¥æ¬èªã®äŸãããããšãäžã§èŠãäŸã§['æ§','ç¯']ãšåå²ãããŠããŸããããä»ã«ã'æ','é ','ãã'ãªã©ã®ããŒã¯ã³ãèªåœã«ããã°ãçŽæ¥ãã®åèªãèªåœã«ãªããŠã'æ§æ', 'æ§é ', 'æ§ãã'ãšãã£ãèªãããŒã¯ãã€ãºããããšã³ã³ãŒãã»ãã³ãŒãã§ããŸãã
ããã§ãããããªããã£ãæååäœã«åºåãã°ãããããªããããšæããããããããŸãããããã®å Žåã¯ããåé¡ãçºçããŸããããã«ã€ããŠã¯åŸè¿°ããŸãã
倿§ãªèšèªãžã®é©çšæ§
ããã¹ããåå²ããæ¹æ³ãšããŠèããããã®ã¯ãè±èªã®å Žåã¯åèªåºåããæ¥æ¬èªã®å Žåã¯åœ¢æ çŽ è§£æãªã©ãæããããŸãããã®æç¹ã§ãèšèªã«ãã£ãŠç°ãªãå岿¹æ³ãåè£ãšãªã£ãŠãããšããããšãããããŸããããããLLMãéçºããäžã§ããã¯æãŸãããããŸãããçç±ã¯ãæ±çšçãªLLMã䜿ã£ãŠããŠãããéããLLMã§è§£ãããã¿ã¹ã¯ã«ã¯ç¿»èš³ãã³ãŒãçæãšãã£ãèšèªæšªæçãªãã®ãå€ãããããã§ããããã§ãäžã«æãããããªBPEãUnigramãçšããããŒã¯ãã€ã¶ãŒã§ã¯çã®ããã¹ãããåŠç¿ãè¡ããããèšèªäŸåæ§ã®åé¡ã解決ããããšãã§ããŸãã
ãŸãè±èªã𿥿¬èªã®å€§ããªéããšããŠã¯ãåèªã空çœã§åºåãããŠãããã©ãããã§ãããšèšããŸããããããã®èšèªã®æ±ããè¿ã¥ããããã«ã空çœãããŒã¯ã³ãšããŠæ±ããŸãã
äŸãã°ä»¥äžã®ãããªããŒã¯ãã€ãºãè¡ããŸããïŒ_ã¯ç©ºçœãæå³ãããïŒ
"Hello World.â â [ 'Hello', '_Wor', 'ld', '.' ]
âããã«ã¡ã¯äžçãâ â [ 'ããã«ã¡ã¯', 'äžç', 'ã' ]
ããã«ãã£ãŠãããŒã¯ã³ã®äžŠã³ããã³ãŒãããéã«ãHello World.ãšããã«ã¡ã¯äžçããæ£ããå
ã«æ»ãããšãã§ããŸããã€ãŸãã空çœãããŒã¯ã³ãšããŠæ±ã£ãŠããŒã¯ãã€ã¶ãŒã®åŠç¿ãè¡ãããšã§ã空çœåºåãã®èšèªãšããã§ãªãèšèªãäžç·ã«æ±ãããšãã§ãããšããããšã§ãã
LLMã®èšç®å¹çã®åäž
å ã»ã©ãæååäœã®åå²ã«ã¯èª²é¡ããããšè¿°ã¹ãŸãããããã®çç±ã«ã€ããŠèª¬æããŸãããŸãåæãšããŠLLMã®äºååŠç¿ã«ã¯å€§éã®ã³ãŒãã¹ãšèšç®ãªãœãŒã¹ãå¿ èŠã§ããäºååŠç¿ã¯ç°¡åã«èšãã°ãæ¬¡ã«æ¥ãããŒã¯ã³ã®äºæž¬ãã«ãã£ãŠè¡ããããããããŒã¯ã³ã®æ°ãå€ãã»ã©å¿ èŠãªèšç®éã¯å€ããªããŸãããããã£ãŠã1ããŒã¯ã³ã§è¡šçŸãããæåæ°ãå€ãã»ã©èšç®å¹çã¯é«ããšããããšã§ãã
äžè¬çãªæ¥æ¬èªLLMã§ã¯ãæ¥æ¬èªã¯1ããŒã¯ã³=1.5æåã2æåçšåºŠã§è¡šçŸãããããã1æååäœã§åºåãå Žåã«æ¯ã¹ãŠãèšç®å¹çã1.5åã2åã»ã©é«ããªããŸããå€ãã®LLMéçºã§ã¯èšç®éã«æ¯äŸããŠèšå€§ãªçµæžçã³ã¹ãããããããããã®ãããªèšç®å¹çã®åäžã¯éåžžã«éèŠãªãã€ã³ãã§ãããšèšããŸãã
åŸè¿°ããŸããæ¥æ¬èªããã€ãåã§è¡šèšãããš1æåããã3ãã€ãã§è¡šçŸãããããšãå€ãããã1æå=3ããŒã¯ã³ãšãªãããšããããŸãããã£ãŠã1æå=1ããŒã¯ã³ãšãªãããšã§2å以äžã®å¹çåã«ã€ãªãããšèããããŸãã
ãŸããããŒã¯ãã€ãºã®å¹çãäžããããšã¯äºååŠç¿ã ãã§ã¯ãªãæšè«é床ã«ãå¯äžããŸããå°ãåã«å ¬éãããGPT-4oã䜿ãããŠããæ¹ã¯æãããããããŸãããããã¡ãã¯åŸæ¥ã®GPT-4ãšæ¯ã¹ãŠé«éã«ã¬ã¹ãã³ã¹ãè¿ãããã«ãªã£ãŠããŸããäž»ãªèŠå ã¯ãèªåœã«ã»ãšãã©å«ãŸããŠããªãã£ãæ¥æ¬èªãèªåœã«è¿œå ãããåãããã¹ãã§ãããå°ãªãããŒã¯ã³ã§å ¥åã»åºåã§ããããã«ãªã£ãããšã§ãããšèããããŸãã
1-2. ãå è¡ç 究調æ»ãããŒã¯ãã€ã¶ãŒã®è©äŸ¡ææš
ããããã¯ãGENIACãããžã§ã¯ãã«ãŠããŒã¯ãã€ã¶ãŒãæ§ç¯ããã«ããã£ãŠèª¿ã¹ãããšã«ã€ããŠç޹ä»ããŠãããŸããç§èªèº«ãäžã®ãããªåºç€ç¥èã¯ãã£ããã®ã®ããŒã¯ãã€ã¶ãŒãäœããšããçµéšã¯ãªãã£ãããããŸããã©ã®ãããªããŒã¯ãã€ã¶ãŒããããšãããã®ãïŒããšããçåããããŸãããããã§è©äŸ¡ææšã«ã€ããŠèª¿ã¹ãŠã¿ãŸããã
äžè¬çãªè©äŸ¡ãšããŠã¯ä»¥äžã®ãããªãã®ãããããšãããããŸããã
-
Fertility
- æç« ã衚çŸããã®ã«å¿ èŠãªããŒã¯ã³ã®å¹³åæ°ãã¹ã³ã¢ãé«ãã»ã©ããŒã¯ãã€ã¶ãŒã®å§çž®çãäœãããšãæå³ããã
-
Parity
- ç°ãªãèšèªã«å¯ŸããŠããŒã¯ãã€ãºãããšãã®ããŒã¯ã³æ°ã®é·ãã®ãã©ã³ã¹ãç€ºãææšãã¹ã³ã¢ãé«ãã»ã©å€èšèªã§ã®ããŒã¯ãã€ãºã®ãã©ã³ã¹ããããFLORES-200ã®ãããªå€èšèªç¿»èš³ã³ãŒãã¹ã䜿ã£ãŠãèšèªéã®ããŒã¯ã³æ°ã«ãã£ãŠåçæ§ãæ¯èŒããããšãã§ããã
èšèªAã®æã®ããŒã¯ã³æ° / èšèªBã®æã®ããŒã¯ã³æ°ã1ã«è¿ãã»ã©Parityãé«ãã
- ç°ãªãèšèªã«å¯ŸããŠããŒã¯ãã€ãºãããšãã®ããŒã¯ã³æ°ã®é·ãã®ãã©ã³ã¹ãç€ºãææšãã¹ã³ã¢ãé«ãã»ã©å€èšèªã§ã®ããŒã¯ãã€ãºã®ãã©ã³ã¹ããããFLORES-200ã®ãããªå€èšèªç¿»èš³ã³ãŒãã¹ã䜿ã£ãŠãèšèªéã®ããŒã¯ã³æ°ã«ãã£ãŠåçæ§ãæ¯èŒããããšãã§ããã
-
LPTïŒLength Per TokenïŒ
- 1ããŒã¯ã³ãããã®æåæ°ãæå³ãããããã¹ãã®å§çž®æ¯ã®éæ°ã§ã
æåæ° / ããŒã¯ã³æ°ã§æ±ããã倧ããã»ã©å§çž®çãé«ããLPTã¯èªåœæ°ãšæ£ã®çžé¢ããã€ã
- 1ããŒã¯ã³ãããã®æåæ°ãæå³ãããããã¹ãã®å§çž®æ¯ã®éæ°ã§ã
1-3. ãå è¡ç 究調æ»ãã¢ã«ãŽãªãºã ã®éããšäžæµã¿ã¹ã¯ã®ç²ŸåºŠ
代衚çãªã¢ã«ãŽãªãºã ãšããŠBPEãšUnigramãäžããŸããããå€ãã®LLMã®ããŒã¯ãã€ã¶ãŒã§ã¯ãããã®ã©ã¡ãããçšããããŠãããããããŒã ã®éçºãšããŠãã©ã¡ãããçšããããšãæ€èšããŠããŸããããã ããã©ã¡ããä»åã®æ¥æ¬èªLLMéçºã«é©ããŠããããæ±ºå®ã¥ããããšãé£ãããæçµçã«ã¯åèã«ããŠããæ¥æ¬èªã¢ãã«ãšäœ¿çšãããã©ã€ãã©ãªãšã®äºææ§ãèžãŸããŠæ±ºå®ããŸããã
ãããã念ã®ããã©ã®ãããªå è¡ç ç©¶ããããã¯èª¿ã¹ãŠããŸãããäžã«æããTokenizer Choice For LLM Training: Negligible or Crucial? (2023)ã§ã¯ãBPEãšUnigramã®ã©ã¡ããLLMã®äžæµã¿ã¹ã¯ã®æ§èœãé«ãããå®éšããŠããŸãããæ¬è«æã§ã¯è±èªããã³ãšãŒãããåã®å€èšèªãæ±ã£ãŠãããããæ¥æ¬èªã§ã¯ãããŸãããçµè«ãšããŠã¯ãå€èšèªã®å Žåã¯Unigramã䜿ã£ãå Žåã®äžæµã¿ã¹ã¯ã®æ§èœãé«ããšããããšãè¿°ã¹ãããŠããŸããã
1-4. ãå è¡äºäŸèª¿æ»ã代衚çãªæ¥æ¬èªã¢ãã«ã®ããŒã¯ãã€ã¶ãŒ
ããŒã¯ãã€ã¶ãŒãæ§ç¯ããã«ããã£ãŠãä»ã®æ¥æ¬èªãæ±ãã®ã«é©ããLLMã®ããŒã¯ãã€ã¶ãŒã«ã€ããŠèª¿æ»ãããŠããŸããã
| ã¢ãã« | åŠç¿ã³ãŒãã¹ã®èšèª(*1) | èªåœæ° | ã¢ã«ãŽãªãºã | åè |
|---|---|---|---|---|
| stabilityai/japanese-stablelm-base-alpha-7b | è±èª(*2), æ¥æ¬èª | 65,536(*3) | BPE | blog |
| elyza/ELYZA-japanese-Llama-2-7b | è±èª(*2), æ¥æ¬èª | 45,043(*3) | BPE | blog |
| llm-jp/llm-jp-13b-v1.0 | è±èª, æ¥æ¬èª | 50,688 | Unigram | paper |
| stabilityai/japanese-stablelm-base-ja_vocab-beta-7b | è±èª(*2), æ¥æ¬èª | 49,408(*3) | BPE | blog |
| tokyotech-llm/Swallow-7b-hf | è±èª(*2), æ¥æ¬èª | 43,176(*3) | BPE | paper |
| rinna/nekomata-14b | è±èª(*4), äžåœèª(*4), æ¥æ¬èª | 151,936 | BPE | blog |
*1) äž»ãšããŠæ§æãããŠããèšèªã®ã¿èšèŒããŠããŸããæ§ææ¯ãå°ããèšèªãããã°ã©ã ã¯çç¥ããŠããŸãã
*2) Llama 2ãç¶ç¶äºååŠç¿ããã¢ãã«ã§ãããããLlama 2ã®äºååŠç¿æã§äœ¿çšãããŠããããŒã¿ã«ãããŠè±èªãäž»ã§ããããšã瀺ããŠããŸãã
*3) Llama 2ã®èªåœãæ¡åŒµããŠããããããããã®ãã¡32,000ããŒã¯ã³ã¯Llama 2ã§ãã§ã«èšå®ãããŠããèªåœã«ãªããŸãã
*4) Qwen 7Bãç¶ç¶äºååŠç¿ããã¢ãã«ã§ãããããLlama 2ã®äºååŠç¿æã§äœ¿çšãããŠããããŒã¿ã«ãããŠè±èªãšäžåœèªãäž»ã§ããããšã瀺ããŠããŸãã
ãããã¿ããšãå€ãã®ã¢ãã«ãBPEãçšããŠããããšãããããŸãããããã¯ããŒã¹ãšãªã£ãŠããLlama 2ã®ããŒã¯ãã€ã¶ãŒãBPEãçšããŠããããã§ãããŒãããäºååŠç¿ããŠããllm-jp/llm-jp-13b-v1.0ã§ã¯UnigramãçšããããŠããããã®ã¢ãã«ã¯äºååŠç¿ããããŒã¿ã®èšèªãã¡ã€ã³ã®å²åãšããŠè±èªã𿥿¬èªããããããååãã€åŠç¿ããŠããŸãããä»åã®LLMéçºã§ç§ãã¡ã®ããŒã ãåæ§ã«è±èªã𿥿¬èªã1:1çšåºŠã®å²åã§åŠç¿ããããšãæ€èšããŠãããããllm-jp/llm-jp-13b-v1.0ãåèãšãããŠããã ããŸããã
1-5. ãå®è£ æ¹æ³ãæŸå°Ÿç æšæºã³ãŒãã®çè§£
ããããã¯å®è£
ã«é¢ããå
容ã«å
¥ã£ãŠãããŸãã
æ¬ãããžã§ã¯ãã§ã¯ãéå¶ã§ããæŸå°Ÿã»å²©æŸ€ç 究宀ãããLLMéçºã®æšæºã³ãŒãã»æé ããšããŠããµã³ãã«ããã°ã©ã ããæäŸããã ããŠããŸãããç§ã¯ããŒã¯ãã€ã¶ãŒã®æ§ç¯ãçµéšããããšããªãã£ãã®ã§ãå®è£
ã«ã€ããŠã¯ãŸããã¡ãã®ã³ãŒãã®çè§£ããå§ããŸããã
ããŒã¯ãã€ã¶ãŒã®åŠç¿ã³ãŒã
ã³ãŒãçè§£ã®ã¡ã¢
-
spm.SentencePieceTrainer.trainãšããèšèŒãããããããã«ãããŒã¯ãã€ã¶ãŒã®æ§ç¯ã«ã¯SentencePieceãçšããããŠããã - åŒæ°ãæ§ã ããããããã以äžã®ãããªæå³ã§ãããïŒå šãŠã®åŒæ°ã«ã€ããŠç¥ãããå Žåã¯ããã¥ã¡ã³ãã確èªãïŒ
input=args.input, # ã€ã³ãããïŒåŠç¿ããŒã¿ïŒ
model_prefix=args.model_prefix, # ã¢ãã«ã®æ¥é èŸ
vocab_size=args.vocab_size, # èªåœãµã€ãº
input_sentence_size=args.input_sentence_size, # åŠç¿ã«äœ¿ãæå€§ã®ã»ã³ãã³ã¹æ°
shuffle_input_sentence=args.shuffle_input_sentence, # ã»ã³ãã³ã¹ãã·ã£ããã«ãããã©ãã
num_threads=args.num_threads, # åŠç¿ã®ã¹ã¬ããæ°
character_coverage=args.character_coverage, # æåã®ã«ããŒå²å
model_type=args.model_type, # ã¢ã«ãŽãªãºã
train_extremely_large_corpus=args.train_extremely_large_corpus, # Unigramã®ãããæ·±åºŠãå¢å ããããã©ããïŒå€§èŠæš¡ã³ãŒãã¹ã䜿ãå Žåã«æå¹ã«ããïŒ
user_defined_symbols=[BOS_TOKEN, âŠ] # ãŠãŒã¶ãŒå®çŸ©ããŒã¯ã³ã®èšå®
byte_fallback=True, # ãã€ããã©ãŒã«ããã¯
split_digits=True, # æ°åãåå²ãããã©ãã
allow_whitespace_only_pieces=True, # 空çœãããŒã¯ã³ãšããŠæ±ããã©ãã
remove_extra_whitespaces=False, # é£ç¶ãã空çœãåé€ãããã©ãã
- ãŠãŒã¶ãŒå®çŸ©ããŒã¯ã³ãšããŠã¯ãspecial_token_list.pyã«ãŠä»¥äžã®ããã«èšå®ãããŠããã
UNK_TOKEN = "<unk>"
BOS_TOKEN = "<s>"
EOS_TOKEN = "</s>"
PAD_TOKEN = "<pad>"
CLS_TOKEN = "<CLS>"
SEP_TOKEN = "<SEP>"
EOD_TOKEN = "<EOD>"
MASK_TOKEN = "<MASK>"
NEWLINE_TOKEN = "\n"
- 以äžã®ãããªã¹ã¯ãªããã§
argsãèšå®ãã€ã€ããŒã¯ãã€ã¶ãŒã®åŠç¿ãå®è¡ããã
python train_sentencepiece_tokenizer.py
--input /path/to/dataset1.jsonl,/path/to/dataset2.jsonl,/path/to/dataset3.jsonl \
--model_prefix ${YOUR_TOKENIZER_NAME} \
--vocab_size 32000 \
--input_sentence_size 3000000 \
--shuffle_input_sentence True \
--num_threads 16
- åŠç¿ããåŸãSentencePieceããHuggingFaceåãžå€æããã倿ã³ãŒãã¯ä»¥äžã
-
from transformers import T5Tokenizerã§T5Tokenzierãšããã¯ã©ã¹ãååŸããŠãã¢ãã«ãã¡ã€ã«ãåçš®èšå®ãæž¡ããŠHuggingFaceã®transformers`ã©ã€ãã©ãªã§æ±ããããŒã¯ãã€ã¶ãŒã«å€æããŠãããšèªã¿åããã
ãã®æç¹ã§åçš®åŒæ°ã®æå³ãªã©ãå šãŠçè§£ããããšã¯ã§ããŸããã§ããããå šäœçãªå®è£ ã®æµãã¯æŽãããšãã§ããŸããããããããšã«æå³éãã®æåãããããªã©ãå®éšçã«ç¢ºãããªããããŒã¯ãã€ã¶ãŒæ§ç¯ããããšãšããŸããã
ååããŒãã®ã1. ããŒã¯ãã€ã¶ãŒæ§ç¯ã®åãçµã¿ãéããŠåŠãã ããšãã¯ãããŸã§ãšããŸããèããããšã䜿ã£ãããšããããä»çµã¿ãããç¥ããªãã£ããšããæ¹ãããããŸã§ã®å 容ã§ããçšåºŠã®åºç€ç¥èãæããããšãã§ããŠããã°å¹žãã§ãã
2. ããŒã ã®åãçµã¿ç޹ä»
ããããã¯ããŒã ã®LLMéçºã§å®éã«åãçµãã ããŒã¯ãã€ã¶ãŒæ§ç¯ã«ã€ããŠç޹ä»ããããšæããŸãã
2-1. ã©ã®ãããªããŒã¯ãã€ã¶ãŒãäœãã
ãŸãã©ã®ãããªããŒã¯ãã€ã¶ãŒãäœãããæ€èšããŸãããç¹ã«å€§ããªãã€ã³ããšããŠã¯ä»¥äžãæããããŸããã
èªåœæ°
äžè¿°ããéããããŒã¯ãã€ã¶ãŒã¯èªåœæ°ã倧ããªãã€ã³ãã«ãªããŸããå è¡äºäŸèª¿æ»ã§èŠãããã«åœæã®æ¥æ¬èªLLMã®å€ããçŽ50,000èªã®èªåœãèšå®ããŠããŸããããã®ãããç§ãã¡ã®ããŒã ã§ãåçãµã€ãºã«ããããšãšããŸããããã ããåœæã¯QwenïŒçŽ15äžèªïŒãGemmaïŒçŽ25äžèªïŒãšãã£ã髿§èœãªã¢ãã«ãã¡ããã©ç»å Žãå§ããé ã§ãããèªåã®äžã§ã¯ãèªåœãµã€ãºã倧ããæ¹ãLLMã®æ§èœãäžããã®ãïŒããšãã仮説ãåºãŠããŠããŸãããããã§ãæçµçã«ã¯50,000èªããå°ãã ãå€ãã56,320èªã«èšå®ããŸããã
ãŸããèªåœã®å èš³ã«ã€ããŠã§ãããäžã«æããLlama 2ãç¶ç¶äºååŠç¿ããã¢ãã«ã§ã¯32,000èªã«çŽ20,000èªã®ããŒã¯ã³ã远å ããŠãããããè±èªã𿥿¬èªã®æ¯çã¯ãããã3:2ãšãªã£ãŠããŸãããã ãããããã®ã¢ãã«ã¯ãããŸã§ãLlama 2ã®äºååŠç¿ãã¡ã€ã³ã§ãã£ããããè±èªã®ããŒã¯ã³ã®å²åãå€ãããšã¯èªç¶ã§ããããã«æããŸãã
ç§ãã¡ã®ããŒã ã§ã¯ãè±èªã𿥿¬èªã®ããã¹ããåããããã®éã§äºååŠç¿ãè¡ãäºå®ã§ãã£ãããšãããããŒã¯ãã€ã¶ãŒã®èªåœã1:1çšåºŠãæ³å®ããŠããŒã¯ãã€ã¶ãŒãåŠç¿ããããšèããŸãããããããæ¥æ¬èªããã¹ãã§ç²åŸããèªåœã«ãå€ãã®ã¢ã«ãã¡ããããå«ãŸããŠãããããçµæçã«ã¯è±èªã𿥿¬èªã®èªåœã¯3:2ã«è¿ãå²åã«ãªããŸããã
ã¢ã«ãŽãªãºã
ãã¡ãã¯äžè¿°ããéããUnigramãçšããŠããŸããå è¡ç ç©¶ã®ããšãŒãããåã§ã®å€èšèªã®å Žåã«ã¯Unigramã®æ¹ãäžæµã¿ã¹ã¯ã®æ§èœãé«ãã£ãããšãã瀺åããllm-jp/llm-jp-13b-v1.0ãåèã«ããŠãããšããçç±ã®ã»ããllm-jp-tokenizerãšãããªããžããªãè€æ°èšèªã®èªåœã®å²åã調æŽããªããããŒã¯ãã€ã¶ãŒãæ§ç¯ããã®ã«åœ¹ç«ã¡ããã§ããããã¡ããUnigramããŒã¹ã®æ¹æ³ãšãªã£ãŠããããšãããUnigramã䜿ãããšãšããŸããã
åŠç¿ããŒã¿
ããŒã¯ãã€ã¶ãŒã®åŠç¿ã«ã¯ã§ããã ãæŽé ãããããã¹ãã§ããããšãæãŸãããããäž»ã«ã¯wiki40bãçšããŸãããæ¥æ¬èªãšè±èªã®ã©ã¡ããæŽåãããŠãããããäž¡èšèªãšããã¡ãã®ããã¹ãããŒã¿ãã¡ã€ã³ã§åŠç¿ã«äœ¿ããŸããããŸããä»åã®LLMéçºã®è©äŸ¡ã¿ã¹ã¯ã«ã¯ããã°ã©ã çæã¿ã¹ã¯ãæ°åŠã¿ã¹ã¯ãå«ãŸããããšãããã£ãŠãããããèªåœã«ãã³ãŒãç¹æã®è±èªãæ°åŠèšå·ãå«ããããšãç®çãšããŠãäºåŸåŠç¿ã«å©çšããããšèããŠããMBPPãGSM8Kãèªåœç²åŸã«äœ¿ãããšãšããŸããã
2-2. å®è£ ã«ã€ããŠ
å šäœå
å
šäœçãªæµããšããŠã¯ä»¥äžã®ããã«ãåãã¡ã€ã³ã³ãŒãã¹ã§å¥ã
ã«ããŒã¯ãã€ã¶ãŒãåŠç¿ããŠèªåœãç²åŸããä»»æã®å²åã§çµ±åããŠæçµçãªèªåœãšã¢ãã«ãäœããšããæé ã§é²ããŸããã

ã¹ã¯ãªãã
ããŒã ã®ãªããžããªã«ãŠã¹ã¯ãªãããå
¬éããŠããŸãã
åºæ¬çã«ã¯æŸå°Ÿç LLMéçºæšæºã³ãŒããšllm-jp-tokenizerãåèã«ãããŠããã ããŠããŸãã
ã¢ãã«
ããŒã ã®HuggingFaceã«ãŠããŒã¯ãã€ã¶ãŒãå ¬éããŠããŸãã
å®è£ æé
åŠç¿çšããŒã¿ãæºåã§ããŠããåæã§èª¬æããŸãã
1. æ¥æ¬èªããã¹ãã®åœ¢æ çŽ è§£æ
æ¥æ¬èªã«ã€ããŠã¯äºåã«åœ¢æ
çŽ è§£æã®åŠçãå«ããããšã§ã圢æ
çŽ ã®å€§ãã以äžã§ããŒã¯ã³ãåºåãããªãããã«ããŸãããå®è£
æ¹æ³ãšããŠã¯ãfugashiãçšããŠåœ¢æ
çŽ ããšã«||||ãšããæååã§åå²ãè¡ããŸããããã¡ãã®å®è£
ã¯Sentencepiece ã®åå²ã MeCab ã£ãœããããšããèšäºãåèã«ãããŠããã ããŸããã
圢æ
çŽ è§£æãè¡ã£ãããã¹ãã«å¯ŸããŠä»¥äžã®ããã«SentencePieceã§pretokenization_delimiter="||||"ãšèšå®ããããšã§ã||||ãšããåºåãã䜿ã£ãåå²ãé©çšããããšãã§ããŸãã
spm.SentencePieceTrainer.train(
input=args.input, # ã€ã³ããããã¡ã€ã«
âŠ
pretokenization_delimiter="||||"
)
2. èšèªããšã«ããŒã¯ãã€ã¶ãŒãåŠç¿
äžã®éããè±èªã»æ¥æ¬èªã»ç®æ°ã»ã³ãŒãã®ããããã§ããŒã¯ãã€ã¶ãŒãåŠç¿ããŠèªåœãç²åŸããŸããã
è±èªïŒç®æ°ããã³ã³ãŒãïŒã𿥿¬èªã®åŠç¿ã®èšå®ãšããŠå€ããéšåãšããŠã¯ãïŒå
ã»ã©ã®pretokenization_delimiter="||||"ã®èšå®ä»¥å€ã§ã¯ïŒ1ããŒã¯ã³ã«å¯Ÿããæå€§ã®æåæ°ã®èšå®ããããŸãã
spm.SentencePieceTrainer.train(
âŠ
max_sentencepiece_length=16, # æå€§ã®é·ã
âŠ
)
æ¥æ¬èªã§ã¯8æåãè±èªã§ã¯16æåãšããŠèšå®ããŸããã
ãã®ã»ããèšå®ãšããŠã¯ä»¥äžã®ããã«ããŠããŸãããïŒäžéšã®ã¿æç²ïŒ
vocab_size=56,320 # èªåœãµã€ãº
character_coverage=0.9995 # æåã®ã«ããŒç99.95%
model_type="unigram" # ã¢ã«ãŽãªãºã
normalization_rule_name="identity" # æ£èŠåãªã
byte_fallback=True # ãã€ã倿ãã
split_digits=True # æ°ååå²ãã
allow_whitespace_only_pieces=True # 空çœã®ããŒã¯ã³ãèš±å¯ãã
remove_extra_whitespaces=True # äœåãªç©ºçœã®åé€ãã
ãããŸã§ã§èª¬æããŠããŸããã§ããããéèŠã§ããåŒæ°ã3ã€åãäžããŠè§ŠããŠãããŸãã
normalization_rule_name(æ£èŠå)
ãã¡ãã¯æåéããæ£èŠåãã®èšå®ã§ããidentityãnmt_nfkcãèšå®ã§ããåè
ã¯æ£èŠåãªããåŸè
ã¯NFKCæ£èŠåãããæå³ããŸããNFKCæ£èŠåãšã¯ãäºæç䟡ãã§æåãåè§£ããååæãããæ£èŠååŠçã§ããïŒåèïŒ[Unicode æ£èŠå]ïŒ(https://ja.wikipedia.org/wiki/Unicodeæ£èŠå)
æ£èŠåããã®å ŽåãäŸãã°Thisãšthisããã¹ããšïŸïœœïŸã1ãšïŒãåãããŒã¯ã³ãšããŠæ±ãããŸãã
llm-jp/llm-jp-13b-v1.0ãtokyotech-llm/Swallow-7b-hfã®ããŒã¯ãã€ã¶ãŒã§è©Šãããšãããäžã®äŸã¯å
šãŠå¥ã®ããŒã¯ã³ãšããŠæ±ãããŠãããããããããæ£èŠåãªãã®èšå®ã§ãããšèããããŸãããä»åã®ç§ãã¡ã®éçºç®çãèžãŸããŠããæ£èŠåãªãã«ããã¡ãªããã®æ¹ãå€ããšèãããããããnormalization_rule_name="identity"ãšããŸããã
byte_fallbackïŒãã€ããã©ãŒã«ããã¯ïŒ
åºç€ç·šã§èŠãŠããããã«ãããŒã¯ãã€ã¶ãŒã¯èªåœã«å«ãŸããŠããããŒã¯ã³ãããŒã¹ãšããŠåå²
ãšã³ã³ãŒãã»ãã³ãŒããè¡ããŸããéã«èšãã°ãèªåœã«å«ãŸããŠããªãããŒã¯ã³ãæ±ãããšãã§ããã<unk>ãšãã£ãããŒã¯ã³ã«çœ®ãæãããããŸãããã®åé¡ã解決ããããã«ããã€ããã©ãŒã«ããã¯ãšããæ©èœããããŸããããã¯ãæ±ãããæåãèªåœã«å«ãŸããŠããªããšãããã®æåããã€ãåïŒéåžžã¯UTF-8ã®ãã€ãåïŒãšããŠå€æãããã®ã§ãã
äŸãã°ãèªåœã«æŒ¢åã®ããŒã¯ã³ãã»ãšãã©å«ãã§ããªãmeta-llama/Llama-2-7b-hfã®ããŒã¯ãã€ã¶ãŒã«æ¥æ¬èªãããŒã¯ãã€ãºãããŠã¿ããšä»¥äžã®ããã«ãªããŸãã
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
print(tokenizer.tokenize("ããŒã¯ãã€ã¶ãŒæ§ç¯ã®ãã¬ããžãšããŒã ã®åãçµã¿ç޹ä»"))
# åºå
['â', 'ã', 'ãŒ', 'ã¯', 'ã', 'ã€', 'ã¶', 'ãŒ', '<0xE6>', '<0xA7>', '<0x8B>', '<0xE7>', '<0xAF>', '<0x89>', 'ã®', 'ã', 'ã¬', 'ã', 'ãž', 'ãš', 'ã', 'ãŒ', 'ã ', 'ã®', 'å', 'ã', '<0xE7>', '<0xB5>', '<0x84>', 'ã¿', '<0xE7>', '<0xB4>', '<0xB9>', 'ä»']
ãããã¿ããšãæ§ç¯ã'<0xE6>', '<0xA7>', '<0x8B>', '<0xE7>', '<0xAF>', '<0x89>'ãšãããã€ãåã«å€æãããŠããããšãããããŸããèªåœã«ã¯æ§ãç¯ãšãã£ã挢åãå«ãŸããŠããªãããããã€ãåã«å€æããããšã§æªç¥èªã«å¯Ÿå¿ããŠããŸããéã«ããã¹ãããã³ãŒããããšãã«ã¯ãã®ãã€ãåãçšããããšã§ãæ§ç¯ãšããæŒ¢åã®æååãåºåããããšãã§ããŸãããã®ããã«ã挢å2æåã6ããŒã¯ã³ã§è¡šçŸããŠããããå¹çã¯æªãã§ããããã€ããã©ãŒã«ããã¯ã䜿ãããšã§ãæªç¥èªãæ±ãããšãã§ããŸãã
split_digitsïŒæ°åã®åå²ïŒ
ãã¡ãã¯ããã¥ã¡ã³ãã«"split all digits (0-9) into separate pieces"ãšèšèŒãããããã«ãæ°åãåå²ãããã©ããã®èšå®ã§ããä»åã¯Trueã«èšå®ããŸãããçç±ãšããŠã¯ãæ°ã衚çŸããéã«æ¡æ°ãæããªãããšãLLMã®æ§èœã«åœ±é¿ãåãŒãå¯èœæ§ããããšãã£ãç¥èŠãèŠãããããã§ãã
3. èªåœã®è¿œå ã»æŽå
ãããŸã§ã§ãåèšèªã«å¯Ÿããèªåœãç²åŸã§ããŸãããå®éã«äžèº«ãèŠãŠã¿ããšãæ¥æ¬èªã«ã€ããŠã¯ã«ã¿ã«ãèªãå€ããäžè¬çã«å©çšããèªã衚çŸãããŸãå«ãŸããŠããªãããšãããããŸãããïŒäžè¿°ããåçç¹ã®éãã倿§ãªããã¹ãã䜿ãããšã§é²ãããšãã§ãããããããŸãããïŒ
ããã§ãæ¥æ¬èªããã³èšå·çãäžå¿ã«æåã§èªåœã远å ããããšãšããŸããã
- äžè¬èª
- wikitionary ãæ¥æ¬èªã®åºæ¬èªåœ1000ããæœåºããŠè¿œå ã
- wikitinary ãåèã«åè©ã»åœ¢å®¹è©ãªã©åè©ããšã«ãã䜿ããã®ã宿§çã«éžå¥ããŠè¿œå ã
- æååº ãåžžçšæŒ¢åäžèŠ§è¡šãã®äŸããäžéšããµã³ããªã³ã°ããŠè¿œå ã
- æéã»å£ç¯ã»æ¹è§ã«é¢ããèªã远å ã
- éœéåºçã»èгå å°ã»æ±äº¬23åºãªã©ã®åå°ã®åç§°ã远å ã
- é »åºããæ¥æ¬ã®èåã远å ã
- å®å衚çŸ
- ãããã«ã¡ã¯ããããããããããããŸãããªã©ã®å®åçãªè¡šçŸã远å ã
- æ°åããã³èšå·
- 挢æ°å
- åè§æ°å0~9
- å šè§æ°åïŒãïŒ
- äžä»ãæ°å0ã9
- æ°åŠã«åºãŠããã®ãªã·ã£æå
- ã(ããã*ããªã©ãã䜿ãããèšå·
- æ§ã ãªé·ãã®ç©ºçœã®é£ç¶ïŒããã°ã©ã çæãªã©ã§åœ¹ã«ç«ã¡ãŸããïŒ
èšæ¶ãå®ãã§ã¯ãããŸããããåèšã§æ°åã1äžã»ã©ã®èªåœã远å ããããšæããŸãã
èªåœã远å ããåŸã«éè€ãåé€ããã¹ã³ã¢ã®äœãããŒã¯ã³ãåé€ããããšã§ãä»»æã®èªåœæ°ã«èª¿æŽããŸããã
4. ã¹ã³ã¢ã®åæšå®
åèšèªã§èªåœãç²åŸããŠããŒãžããåŸã¯ãUnigramã«ãã£ãŠåããŒã¯ã³ã«å¯ŸããŠã¹ã³ã¢ä»ããè¡ããŸãã詳现ã¯ã¹ã¯ãªããããåç §ããã ããã°ãšæããŸãããèªåœãèšå®ããŠããã¹ãããã¹ã³ã¢ãååŠç¿ããããšã§ã¹ã³ã¢æšå®ãã§ããŸããããã§ã¯åèšèªã®ããã¹ããå šãŠäœ¿ããŸããã
5. èªåœããããŒã¯ãã€ã¶ãŒæ§ç¯
äžã®ã¹ããããŸã§ã§ãèªåœãšåããŒã¯ã³ã«å¯Ÿããã¹ã³ã¢ä»äžãã§ããŸãããããã䜿ã£ãŠããŒã¯ãã€ã¶ãŒã®ã¢ãã«ãã¡ã€ã«ãäœãå¿ èŠããããŸããããã¡ãã¯llm-jp-tokenizerã®ãã¡ãã®ã¹ã¯ãªããã䜿çšãããŠããã ããŸããã
6. HuggingFaceã®ããŒã¯ãã€ã¶ãŒåãžå€æ
æŸå°Ÿç LLMéçºæšæºã³ãŒãã«ãã£ãããã«ãHuggingFaceã®ã¯ã©ã¹ã«é©çšããããŒã¯ãã€ã¶ãŒãšããå¿
èŠããããŸããæšæºã³ãŒãã§ã¯T5Tokenizerã®ã¯ã©ã¹ã䜿ãããŠããŸãããããããç§ãã¡ã®ããŒã ã§ã¯dMoEãšããMoEã¢ãŒããã¯ãã£ã®LLMãæ§ç¯ããæ¹éãšããŠãããMixtralããŒã¹ã®ã¢ãã«ãäœããšããæµãã«ãªã£ãŠããŸãããããã§ãæ¬å®¶mistralai/Mixtral-8x7B-v0.1ã¯LlamaTokenizer圢åŒã䜿çšããŠããããšãããã£ããããããŒã ã«ãããŠãT5Tokenizerã§ã¯ãªãLlamaTokenizerã§ããŒã¯ãã€ã¶ãŒãäœãããšãšããŸããã
å®è£
ã¯ã·ã³ãã«ã§ãæšæºã³ãŒãã®T5TokenizerãLlamaTokenizerã«ããã ãã§ããããæšæºã³ãŒãã§1ç¹æ³šæãå¿
èŠãªããšããããŸãããããã¯ãã¯ã©ã¹ã®èšå®ã®äžã€ã§ããsplit_special_tokensãTrueã«ãªã£ãŠããããšã§ãããã¡ãã¯ç¹æ®ããŒã¯ã³ãåå²ãããã©ããã®èšå®ã§ãããTrueã®å Žåãç¹æ®ããŒã¯ã³ãåå²ãããŠããŸããããæé ããŒã¯ã³ãææ«ããŒã¯ã³ãæå³ããŠããäžã€ã®ããŒã¯ã³IDã§ã¯æ±ãããªãããšã«ãªããŸãã
tokenizer.split_special_tokens=True
tokenizer.tokenize("ããã¯ããŒã¯ãã€ã¶ãŒã®ãã¹ãã§ãã </s>")
tokenizer.split_special_tokens=False
tokenizer.tokenize("ããã¯ããŒã¯ãã€ã¶ãŒã®ãã¹ãã§ãã </s>")
# åºå
['â', 'ããã¯', 'ã', 'ãŒã¯', 'ã', 'ã€', 'ã¶ãŒ', 'ã®', 'ãã¹ã', 'ã§ã', 'ã', 'â</', 's', '>']
['â', 'ããã¯', 'ã', 'ãŒã¯', 'ã', 'ã€', 'ã¶ãŒ', 'ã®', 'ãã¹ã', 'ã§ã', 'ã', 'â', '</s>']
äžã®æç« ãã¿ããšãææ«ããŒã¯ã³</s>ãåå²ãããŠããŸã£ãŠããããšãããããŸããæ¬æ¥1ããŒã¯ã³ã§åŠçãããã®ã«å¯ŸããŠ3ããŒã¯ã³äœ¿ãããšã«ãªã£ãŠããŸãäžã«ãææ«ãšããŠã®æå³ãæããããšããç®çãéæã§ããªãæãããããããæ³šæãå¿
èŠã§ãã
以äžããããŒã¯ãã€ã¶ãŒã®æ§ç¯æé ã§ããã
2-3. èŠåŽããç¹
äºåã»äºåŸåŠç¿ã©ã€ãã©ãªãšã®æŽåæ§ã®èª¿æ»
äžã§T5TokenizerãšLlamaTokenizerãåºããŸãããããã®ãããªããŒã¯ãã€ã¶ãŒã®ã¯ã©ã¹ããšã®å€§ããªéãã®äžã€ãšããŠãç¹æ®ããŒã¯ã³ã®èšå®ãããããŸããããã¯æé ããŒã¯ã³ã<s>ã§ããããšãã£ãæååãã®ãã®ã®éãããããŸãããããã¯ãã»ã©å€§ããªåé¡ã§ã¯ãããŸãããéèŠãªã®ã¯ãããã¹ãããšã³ã³ãŒããããšãã«ããã©ã«ãã§èšå®ãããç¹æ®ããŒã¯ã³ã¯äœãããšããç¹ã§ãã
äŸãã°ãmeta-llama/Llama-2-7b-hfãšllm-jp/llm-jp-13b-v1.0ã®ããŒã¯ãã€ã¶ãŒã®éããèŠãŠã¿ãŸãã
from transformers import AutoTokenizer
tokenizer_A = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer_B = AutoTokenizer.from_pretrained("llm-jp/llm-jp-13b-v1.0")
print("="*30, "Llama 2", "="*30, )
print(tokenizer_A.tokenize("This is a pen.", add_special_tokens=True))
print(tokenizer_A.encode("This is a pen.", add_special_tokens=True))
print("="*30, "LLM-jp", "="*30, )
print(tokenizer_B.tokenize("This is a pen.", add_special_tokens=True))
print(tokenizer_B.encode("This is a pen.", add_special_tokens=True))
# åºå
============================== Llama 2 ==============================
['<s>', 'âThis', 'âis', 'âa', 'âpen', '.']
[1, 910, 338, 263, 6584, 29889]
============================== LLM-jp ==============================
['âThis', 'âis', 'âa', 'â', 'pen', '.', '<EOD|LLM-jp>']
[406, 316, 311, 31, 7605, 10013, 7]
ãããã¿ããšãåãã³ãŒããå®è¡ããŠããŸãããmeta-llama/Llama-2-7b-hfã®æ¹ã¯æé ããŒã¯ã³ã§ãã<s>ãä»äžãããŠããã®ã«å¯ŸããŠãllm-jp/llm-jp-13b-v1.0ã®æ¹ã¯ææ«ããŒã¯ã³ã§ãã<EOD|LLM-jp>ãä»äžãããŠããããšãããããŸããããŒã¯ãã€ã¶ãŒã®èšå®ã¯tokenizer_config.jsonã®tokenizer_classãã確èªã§ããŸããããããèŠããšããããLlamaTokenizerãšPreTrainedTokenizerFastãšããã¯ã©ã¹ã䜿ãããŠããããšãããããŸãã
ãããã£ãŠã䜿ãããŠããããŒã¯ãã€ã¶ãŒã®ã¯ã©ã¹ã«ãã£ãŠããšã³ã³ãŒãæã®ç¹æ®ããŒã¯ã³ã®ä»äžã®èšå®ã¯ç°ãªããšããããšã§ãã
ããããªãåé¡ã§ããèŠåŽã«ã€ãªãã£ãããšãããšããã®ãããªç¹æ®ããŒã¯ã³ä»äžã®èšå®ã¯ãäºååŠç¿ãäºåŸåŠç¿ã®ã©ã€ãã©ãªã«ãããã¹ã¯ãªãããšæ·±ãé¢ä¿ããããã§ãã
äŸãã°ãç§ãã¡ã®ããŒã ã§æçµçã«äœ¿çšããåŠç¿ã©ã€ãã©ãªã§ããLlaMA2-Accessoryã§ã¯ããšã³ã³ãŒãåŠçã以äžã®ããã«å®çŸ©ãããŠããŸããã
def encode(self, s: str, bos: bool, eos: bool) -> List[int]:
assert type(s) is str
if self.tokenizer_type == "transformers":
t = self.tokenizer.encode(s, truncation=False, add_special_tokens=False)
else:
t = self.tokenizer.encode(s)
if bos:
t = [self.bos_id] + t
if eos:
t = t + [self.eos_id]
return t
ãã¡ããèŠããšãtokenizer.encode(s, truncation=False, add_special_tokens=False)ãšãªã£ãŠããããšããããšã³ã³ãŒãæã«ç¹æ®ããŒã¯ã³ã¯ä»äžãããªãããšãããããŸãããã ããencodeã¡ãœããã«bosãšeosã®åŒæ°ãæå®ããããšãã§ããããããTrueã®å Žåã«ä»äžãããããã«æžãããŠããŸããå®éã«ãããã®åŒæ°ãã©ã®ããã«èšå®ãããŠå®è¡ãããŠãããã確èªããããã«ã¯ãåŠç¿ã¹ã¯ãªãããèŠã«è¡ãå¿
èŠããããŸãããçµè«ãšããŠã¯input_data = torch.tensor(self.tokenizer.encode(ann, bos=True, eos=True), dtype=torch.int64)ãšããŠãããã¹ãã«å¯ŸããŠæé ããŒã¯ã³ãšææ«ããŒã¯ã³ãäž¡æ¹ãšãä»äžããŠåŠçããåŸã«äºååŠç¿ã«é²ãã§ããããšãããããŸããã
ãã®ãããªåŠçã確èªããªãå Žåã<s><s>ãšããããã«æå³ããé£ç¶ã§ä»äžããŠããããããããç¹æ®ããŒã¯ã³ãä»äžãããŠããªãã£ãããšãã£ãäºè±¡ãçºçããæãããããŸãã ç§ãã¡ã®ããŒã ã§ã¯äºååŠç¿ã®æ¬çªãéå§ãããŸã§ãããã€ãã®ã©ã€ãã©ãªã§æ€èšãããŠãããããå
šãŠã«å¯ŸããŠã®ããŒã¯ãã€ã¶ãŒã®åŠçãèªã¿è§£ãã«è¡ãå¿
èŠãããã倧å€èŠåŽããŸããã
åããäºåŸåŠç¿ã©ã€ãã©ãªã«ã€ããŠãããã€ãæ€èšããŠããããåããããªèŠåŽããããŸãããäºåŸåŠç¿ã§ã¯ãå ¥åããŒã¯ã³ããã¹ã¯ããŠåºåéšåã®ã¿ãæå€±èšç®ãããšãã£ãåŠçãããã®ãäžè¬çã§ããããããã®åºåãäœçœ®ã§ã®ææ«ããŒã¯ã³ã®åŠçãã©ããªã£ãŠããããšãã£ãç¹ã®èªã¿è§£ããå¿ èŠã§ããã
äœãæé©ãããããªããšããé£ãã
èŠåŽããããšãšã¯è¥å¹²ç°ãªããŸããã粟ç¥çã«ãã€ãã£ãããšãšããŠã¯ããèªåã®äœã£ãŠããããŒã¯ãã€ã¶ãŒãæ¬åœã«LLMã®æ§èœåäžã«å¯äžããŠããã®ãããšããçåãæåŸãŸã§æããªãã£ãããšã§ãããã¡ããäºååŠç¿ãäœåºŠãè¡ã£ãŠããŒã¯ãã€ã¶ãŒã®éãã«ãã粟床ã確ããããšããããšã¯ã§ããªãããããå è¡ç ç©¶ãä»ã®äºäŸãåèã«ãããšãããããããããã®ãããããããšããçšåºŠã®æ ¹æ ã§é²ãã§ããããšããå人çã«ã¯ã¡ã³ã¿ã«ãåãããéšåã§ããã
æè¿ã§ã¯Scaling Laws with Vocabulary: Larger Models Deserve Larger Vocabularies (2024)ã§æé©ãªèªåœãµã€ãºã«ã€ããŠç ç©¶ãããŠããããã«ãLLMã®æ§èœã«å¯äžããããŒã¯ãã€ã¶ãŒã®ãã¹ããã©ã¯ãã£ã¹ã¯ç ç©¶ããç¶ããŠãããšæããŸãã®ã§ãåŒãç¶ãåŠãã§ããããšæããŸãã
2-4. ãã®ä» å®è£ ãéããŠåŠãã ããš
Chat Template
HuggingFaceã®ããŒã¯ãã€ã¶ãŒã«ã¯Chat templateãšãããã®ãèšå®ã§ããŸããããã¯ãæç€ºåœ¢åŒã察話圢åŒã§ãã¡ã€ã³ãã¥ãŒãã³ã°ããéã®åœ¢åŒã®çµ±äžãããã®åœ¢åŒã§æšè«ããããã«ããã³ããã«æå®ã®ãã³ãã¬ãŒããèªåé©çšããããã®æ©èœã ãšæãããŸãã
äŸãã°ãmistralai/Mistral-7B-Instruct-v0.1ã§ã¯ä»¥äžã®ããã«åäœãããããšãã§ããŸãã
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.1")
chat = [
{"role": "user", "content": "Hello, how are you?"},
{"role": "assistant", "content": "I'm doing great. How can I help you today?"},
{"role": "user", "content": "I'd like to show off how chat templating works!"},
]
print(tokenizer.apply_chat_template(chat, tokenize=False))
# åºå
<s>[INST] Hello, how are you? [/INST]I'm doing great. How can I help you today?</s> [INST] I'd like to show off how chat templating works! [/INST]
ãã®äŸã§ã¯ãchatãšããŠèŸæžãå
¥ã£ããªã¹ããäœã£ãŠããŸããroleãšcontentãäžããŠapply_chat_templateã¡ãœããã䜿ããšãç¹æ®ããŒã¯ã³ãä»äžããç¶æ
ã§å¯Ÿè©±åœ¢åŒã®ããã«ããã¹ãã倿ããŠãããŸãã
ãã®ãã³ãã¬ãŒãã¯tokenizer_config.jsonã§èšå®ããããšãã§ããŸããå®éã«jsonãã¡ã€ã«ãèŠãŠã¿ããšã以äžã®ããã«å®çŸ©ãããŠããŸãã
"chat_template": "{%- if messages[0]['role'] == 'system' %}\n {%- set system_message = messages[0]['content'] %}\n {%- set loop_messages = messages[1:] %}\n{%- else %}\n {%- set loop_messages = messages %}\n{%- endif %}\n\n{{- bos_token }}\n{%- for message in loop_messages %}\n {%- if (message['role'] == 'user') != (loop.index0 % 2 == 0) %}\n {{- raise_exception('After the optional system message, conversation roles must alternate user/assistant/user/assistant/...') }}\n {%- endif %}\n {%- if message['role'] == 'user' %}\n {%- if loop.first and system_message is defined %}\n {{- ' [INST] ' + system_message + '\\n\\n' + message['content'] + ' [/INST]' }}\n {%- else %}\n {{- ' [INST] ' + message['content'] + ' [/INST]' }}\n {%- endif %}\n {%- elif message['role'] == 'assistant' %}\n {{- ' ' + message['content'] + eos_token}}\n {%- else %}\n {{- raise_exception('Only user and assistant roles are supported, with the exception of an initial optional system message!') }}\n {%- endif %}\n{%- endfor %}\n",
èŠæ £ããªãæžãæ¹ã ãšæããŸããããã¡ãã¯JinjaãšåŒã°ããèšæ³ã§æžãããŠããããã§ããïŒè©³çްã¯ãã¡ãã®ããã¥ã¡ã³ãããåç §ãã ãããïŒ
å®éã«ä»»æã®ãã³ãã¬ãŒããäœã£ãŠã¿ãŸãã
ããã§ã¯ãããã€ã³ã¹ãã©ã¯ã·ã§ã³ãã¥ãŒãã³ã°ã§çšããããalpaca圢åŒã®æ¥æ¬èªçããã³ãã¬ãšããŠäœã£ãŠã¿ãããšæããŸãã
ã€ã¡ãŒãžãšããŠã¯ä»¥äžã®ãããªåœ¢åŒãäœããã°OKã§ãã
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªããã
### æç€º:
{text}
### å
¥å:
{text}
### å¿ç:
ãããjinjaãã³ãã¬ãŒãã§äœããšã以äžã®ããã«æžããŸãããããtokenizer_config.jsonã«è¿œèšããŸããïŒãã®èšæ³ãžã®å€æã¯ChatGPTãªã©ã䜿ããšæ¥œã§ããïŒ
"chat_template":"{% for message in messages %}{% if message['role'] == 'system' %}{{ message['content'] + '\n\n'}}{% elif message['role'] == 'instruction' %}{{ '### æç€º:\n' + message['content'] + '\n\n'}}{% elif message['role'] == 'input' %}{{ '### å
¥å:\n' + message['content'] + '\n\n'}}{% endif %}{% endfor %}### å¿ç:\n\n"
ãã³ãã¬ã®æå確èªãããŠã¿ãŸãã
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("you/your_tokenizer_name")
messages = [
{"role": "system", "content": "以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªããã"},
{"role": "instruction", "content": "GENIACãããžã§ã¯ãã®äžã€ã§ããæ±äº¬å€§åŠæŸå°Ÿç 究宀ã®LLMéçºãããžã§ã¯ãã«ã€ããŠèª¬æããŠãã ããã"},
{"role": "input", "content": "GENIACãšã¯çµæžç£æ¥çã«ããæ¥æ¬ã®çæAIéçºååäžã®ããã®åãçµã¿ã§ãã"},
]
print(tokenizer.apply_chat_template(messages, tokenize=False))
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªããã
### æç€º:
GENIACãããžã§ã¯ãã®äžã€ã§ããæ±äº¬å€§åŠæŸå°Ÿç 究宀ã®LLMéçºãããžã§ã¯ãã«ã€ããŠèª¬æããŠãã ããã
### å
¥å:
GENIACãšã¯çµæžç£æ¥çã«ããæ¥æ¬ã®çæAIéçºååäžã®ããã®åãçµã¿ã§ãã
### å¿ç:
ãã³ãã¬ãŒãéãã«ããã¹ããäœãããããšã確èªã§ããŸããã
åºæ¬çãªããŒã¯ãã€ã¶ãŒã®ã¡ãœãã
æåŸã«ãããŒã¯ãã€ã¶ãŒã®éçºãéããŠãHuggingFaceã®tokenizerã¯ã©ã¹ã«ãããŠãã䜿ãã¡ãœãããèŠããããšãã§ããŸããã®ã§ãã¡ãã玹ä»ããŸããïŒLlamaTokenizerãT5Tokenizerãªã©ã¯ã©ã¹ã«ãã£ãŠäœ¿ããã¡ãœãããç°ãªãå Žåãããã®ã§æ³šæããŠãã ãããïŒ
以äžã¯elyza/ELYZA-japanese-Llama-2-7b-fastã®LlamaTokenizerã䜿ã£ãäŸãšãªã£ãŠããŸãã
tokenizer.tokenize
ãã¡ãã¯æ¬èšäºã§ã䜿ã£ãŠããéããããã¹ããããŒã¯ã³åäœã«åå²ããã¡ãœããã§ãã
add_special_tokens=Trueãšããããšã§ç¹æ®ããŒã¯ã³ãä»äžãããŸãã
tokenizer.tokenize("ããã¯ããŒã¯ãã€ã¶ãŒã®ãã¹ãã§ãã")
tokenizer.tokenize("ããã¯ããŒã¯ãã€ã¶ãŒã®ãã¹ãã§ãã", add_special_tokens=True)
# åºå
['â', 'ããã¯', 'ã', 'ãŒã¯', 'ã', 'ã€', 'ã¶ãŒ', 'ã®', 'ãã¹ã', 'ã§ã', 'ã']
['<s>', 'â', 'ããã¯', 'ã', 'ãŒã¯', 'ã', 'ã€', 'ã¶ãŒ', 'ã®', 'ãã¹ã', 'ã§ã', 'ã']
tokenizer.encode
ãã¡ããæ¬èšäºã§äœ¿ã£ãŠããéããããã¹ããããŒã¯ã³åäœã«åå²ããŠID倿ããã¡ãœããã§ãã
tokenizeã¡ãœãããšç°ãªãç¹ãšããŠã¯ãadd_special_tokens=Trueãããã©ã«ããšãªã£ãŠããŸãããã®ãããadd_special_tokens=Falseãšããããšã§ç¹æ®ããŒã¯ã³ãªãã§ã®ãšã³ã³ãŒãããããŸãã以äžã®äŸã§ã¯æé ããŒã¯ã³ã®<s>ãIDã1ãªã®ã§ããããæ¶ããŠããããšãããããŸããããã«return_tensors="pt"ãšèšå®ããããšã§ããã³ãœã«åœ¢åŒã§è¿ãããšãã§ããŸãã
tokenizer.encode("ããã¯ããŒã¯ãã€ã¶ãŒã®ãã¹ãã§ãã")
tokenizer.encode("ããã¯ããŒã¯ãã€ã¶ãŒã®ãã¹ãã§ãã", add_special_tokens=False)
tokenizer.encode("ããã¯ããŒã¯ãã€ã¶ãŒã®ãã¹ãã§ãã", return_tensors="pt")
# åºå
[1, 29871, 43061, 30279, 43004, 30576, 30260, 43349, 30199, 44698, 42669, 30267]
[29871, 43061, 30279, 43004, 30576, 30260, 43349, 30199, 44698, 42669, 30267]
tensor([[ 1, 29871, 43061, 30279, 43004, 30576, 30260, 43349, 30199, 44698, 42669, 30267]])
tokenizer.encode_plus
ãã¡ãã¯ããã¹ãããšã³ã³ãŒããããã®ãèŸæžåã§è¿ãããšãã§ããinput_idsãattention_maskãããŒãšãªããŸããå®ã¯tokenizer()ã§ãã®ãŸãŸããã¹ããæž¡ãããšãã§ããŸããããã¡ãã®åºåãšencode_plusã®åºåã¯åããã®ãšãªããŸããã
tokenizer.encode_plus("ããã¯ããŒã¯ãã€ã¶ãŒã®ãã¹ãã§ãã")
tokenizer("ããã¯ããŒã¯ãã€ã¶ãŒã®ãã¹ãã§ãã")
# åºå
{'input_ids': [1, 29871, 43061, 30279, 43004, 30576, 30260, 43349, 30199, 44698, 42669, 30267], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
{'input_ids': [1, 29871, 43061, 30279, 43004, 30576, 30260, 43349, 30199, 44698, 42669, 30267], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
tokenizer.batch_encode_plus
ãã¡ãã¯è€æ°ã®ããã¹ãããŸãšããŠãšã³ã³ãŒãããããšãã§ããŸãã
tokenizer.batch_encode_plus([
"ããã¯ããŒã¯ãã€ã¶ãŒã®ãã¹ãã§ãã",
"ããã¯ããŒã¯ãã€ã¶ãŒã®ãã¹ãã§ã¯ãããŸããã"
], padding='max_length', max_length=16, return_tensors='pt')
# åºå
{'input_ids': tensor([[ 1, 29871, 43061, 30279, 43004, 30576, 30260, 43349, 30199, 44698,
42669, 30267, 0, 0, 0, 0],
[ 1, 29871, 43061, 30279, 43004, 30576, 30260, 43349, 30199, 44698,
43418, 30267, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]])}
ãã¡ããã¿ããšmax_lengthã§é·ããæããŠãé·ããæºãããªãéšåã¯0ã§ããã£ã³ã°ãããŠããããšãããããŸãããŸããããã£ã³ã°éšåã¯åŠç¿ãªã©ã®åŠçã«äœ¿ããªãã®ãäžè¬çãªã®ã§ãattention_maskã¯0ã«ãªã£ãŠããŸãã
éã«ããŒã¯ã³ãæå®ã®é·ãã§åãè©°ãããå Žåã¯truncation=Trueãšèšå®ããŸããåãè©°ãã®æ¹åã¯tokenizer.truncation_sideã§èšå®ãããŠãããããrightãleftã§å€æŽã§ããŸãã以äžã®äŸã§ã¯æå€§8ããŒã¯ã³ã«ãªãããã«å·ŠåŽã®ããŒã¯ã³ããåé€ãããŠããŸãã
tokenizer.truncation_side = "left"
tokenizer.batch_encode_plus([
"ããã¯ããŒã¯ãã€ã¶ãŒã®ãã¹ãã§ãã",
"ããã¯ããŒã¯ãã€ã¶ãŒã®ãã¹ãã§ã¯ãããŸããã"
], padding='max_length', max_length=8, return_tensors='pt', truncation=True)
# åºå
{'input_ids': tensor([[ 1, 30576, 30260, 43349, 30199, 44698, 42669, 30267],
[ 1, 30576, 30260, 43349, 30199, 44698, 43418, 30267]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1]])}
tokenizer.decode
ãã¡ãã¯ãšã³ã³ãŒããšéã®åŠçããããã³ãŒãã§ããããŒã¯ã³IDã®ãªã¹ããæž¡ãããšã§æååã«æ»ãããšãã§ããŸãããšã³ã³ãŒããšåãããã«ç¹æ®ããŒã¯ã³ä»äžã®èšå®ããããŸãããåŒæ°ã¯ãšã³ã³ãŒãã§äœ¿ã£ãadd_special_tokensã§ã¯ãªãskip_special_tokens=Trueãšããããšã§ãç¹æ®ããŒã¯ã³ãç¡èŠããŠãã³ãŒãããŸãã
tokenizer.decode([1, 29871, 43061, 30279, 43004, 30576, 30260, 43349, 30199, 44698, 42669, 30267])
tokenizer.decode([1, 29871, 43061, 30279, 43004, 30576, 30260, 43349, 30199, 44698, 42669, 30267], skip_special_tokens=True)
# åºå
"<s> ããã¯ããŒã¯ãã€ã¶ãŒã®ãã¹ãã§ãã"
"ããã¯ããŒã¯ãã€ã¶ãŒã®ãã¹ãã§ãã"
ãããã«
æ¬èšäºã§ã¯GENIAC æŸå°Ÿç LLMéçºãããžã§ã¯ãã®Phase1ã§åãçµãã ããŒã¯ãã€ã¶ãŒã®æ§ç¯æ¹æ³ãšããã®éçšã§åŸãåŠã³ã«ã€ããŠç޹ä»ããŸãããLLMéçºãšãããšäºååŠç¿ãæ¬äžžã§ããæãéèŠãªéšåã§ããã®ã¯ééããªãã§ãããä»åã®åãçµã¿ãéããŠãããŒã¯ãã€ã¶ãŒã¯äºååŠç¿ã»äºåŸåŠç¿ã»æšè«ã®ã»ãŒå
šãŠã«é¢é£ãã倧äºãªèŠçŽ ã§ããããšãããããŸããã
ãŸããç§èªèº«ã¯ãã®ãããžã§ã¯ãã«åå ãããŸã§LLMéçºãããŒã¯ãã€ã¶ãŒæ§ç¯ã«ã¯çŽæ¥æºãã£ãããšããªãã£ããããéåžžã«å€ãã®åŠã³ããããŸããã
æ¹ããŠãçµæžç£æ¥ç, æ±äº¬å€§åŠæŸå°Ÿã»å²©æŸ€ç 究宀, éçºã¡ã³ããŒ, ã³ãã¥ããã£ã¡ã³ããŒãå«ãé¢ä¿è
ã®çæ§ã«ããã®å ŽããåãããŠæè¬ç³ãäžããããšæããŸããããããšãããããŸããã
æ±äº¬å€§åŠ æŸå°Ÿã»å²©æŸ€ç 究宀ãéå¶ããæŸå°Ÿç LLMã³ãã¥ããã£ã®LLMéçºãããžã§ã¯ã[GENIAC] ã®éçºèšé²ãæ å ±çºä¿¡ã«ãªããŸãã åçš®ãªã³ã¯ã¯ãã¡ã linktr.ee/matsuolab_community
Discussion