【書籍】原論文から解き明かす生成AI
【書籍】原論文から解き明かす生成AI
- amazon: 原論文から解き明かす生成AI
- 原論文から解き明かす生成AIのサポートページ
- 一人読書会ライブ まずはこの本を題材にやってるのでリンク貼っておく。
菊田先生のありがたい本。
読み始め 2026-06-01 (月)
買ってはいたのだが機械学習系の仕事も離れていたし、という事で読んでいなかった。 無職になったのでなんか教科書っぽいものとか読みたいな、と思っていたので、この本を読んでみる。 あまりこの辺に関わる事は無さそうな気もするが、 直接役に立たない事を学ぶのが無職の本懐というものだろう、ということで。
まずは第一章の最初の方を読む程度。
1章のメモ 2026-06-09 (火)
自分の力で論文を読み解くための技術
- 議論が成立する条件を確認する
- 具体例を構成する
- 評価指標の具体例
- パープレキシティの例
- 演習問題1.1, accuracy, precision, recall
- 主張を確認するための具体例
- back propagationの計算量
- 生成AIを実際に触ってみて確認
- 仮定が成り立たない例を考える
- Markovじゃないとは
- 次トークン予測がうまくいきにくい例とは
- 評価指標の具体例
- 実装を読み解いて理解を深める
- 重要な参考文献は踏み込んで調べる
- ハブ
- データセット
- 教科書はどうか?
- アウトプットする事で理解を深める
- 他人に内容を説明
- github issueに読んだメモを書く
- ライブはどうか?
単語
- hypotenuse: 斜辺
- right triangle: 直角三角形
- inscribed circle: 内接円
自分以外の力
- 少人数で深く議論する
- 論文の著者に直接質問する
- ウェブ上で議論する
- 生成AIを使う
ノーテーション
Pは珍しい。logは自然対数。Cover and Thomasやサイコロ本は2を前提にした話が多いので注意が必要。
Universal Approximation Theorem
普遍性定理。
えーと、これか? Cybenko: Approximation by superpositions of a sigmoidal... - Google Scholar
superpositionは重ね合わせだそうで。
ヒルベルトの13番目のプログラムでKolmogorovがすべてのn変数連続関数は1変数の関数の有限の重ね合わせで表せる、みたいな事が言及されているな。 これか?
Kolmogorov–Arnold representation theorem - Wikipedia
Rieszの表現定理とか昔やった気がするが何も覚えてないな。
と数学のフォルダを漁っていたら、買ったまま積ん読だった以下がでてきた。
いい機会なのでこれの最初の方でも読んでみるかなぁ。Rieszの定理は8章だ…
証明のあらすじ
大まかにあらすじくらいは理解した。
Discriminatory
どんなyやθを持ってきても定義の積分が0になる => 測度0 を言えるシグマ。
証明のあらすじ
Gの形でシグマの線形和を作って、これが稠密である事を証明する。 あらすじとしては稠密でないなら分離するような汎関数が作れて、これがdiscriminatoryの仮定に矛盾する、という話と、 シグモイド関数がdiscriminatoryだ、という二段構えの証明。
後者はシグモイド関数のパラメータの所に極端なものをいろいろ入れる事で非ゼロ測度があるなら切り出す事が出来るという感じ。
証明から受ける印象
これは級数の誤差が減っていく、系の証明では無いので、Nを大きくしていくと誤差が減っていくという事は言えない。 だから例えば誤差を0.1以下にしたい、みたいな時にNをどんどん大きくしていくとだんだんと小さくなって目的の誤差の範囲に抑えられたら操作をやめる、 みたいな事を出来るとは言っていない。
あくまでそういうGが存在する、と言っているだけ。
だから実用的には2層のニューラルネットでもノードが多ければ任意の連続関数を近似出来る、という言い方は誤解がある気がする。 どこかにはそういうニューラルネットが存在する、といっているだけ。 Nを増やせば誤差が減っていくという事を言っていないので、適当な所で妥協する余地が無い。
テイラー展開みたいにだんだんと誤差が減っていくという事が言えれば任意の連続関数をノードを増やせば近似出来ると言ってしまえると思うんだが。
Perplexity
サイコロ本とCoverAndThomasを復習する。
導出にAsymptotic Equipartition Propertyが使われてる…(Cover and Thomasの3章のテーマ)
実装を読む、の正規表現
使う方は以下で、
gpt-2/src/encoder.py at 9b63575ef42771a015060c964af2c3da4cf7c8ab · openai/gpt-2
該当箇所のコードを抜き出すと以下になっている(self.patが本文ででてきた正規表現)
for token in re.findall(self.pat, text):
token = ''.join(self.byte_encoder[b] for b in token.encode('utf-8'))
bpe_tokens.extend(self.encoder[bpe_token] for bpe_token in self.bpe(token).split(' '))
self.bpeを読まないと詳しい事は分からないが、tokenごとに別のbpeとなるようにしている、という理解でいいのかな。
1章感想ライブ 2026-06-12 (金) 20時
iLMiNAでライブしてみる試み。どう進めるかはあんまり考えてないが先頭からぱらぱら見つつ思った事とか計算したりとかそういうの。 なんか名前が欲しいな。一人読書会ライブ、とかか?
やってみた所、1.2.2.1までで結構な時間になったので次回は別の日に(Perplexityの手前まで)。
感想: 一人読書会ライブ - なーんだ、ただの水たまりじゃないか
1章感想ライブ続き 2026-06-14 (日)
一人読書会ライブ: 原論文から解き明かす生成AI、1.2.2.2から - YouTube
2章 2026-06-13 (土)
カラースペースの話
Colormetric color spaceの話とかガンマ補正とかを考えると、もうちょっと考えるべき事がある。
sRGBはCRTのガンマ値になっているので、そのままCRTに渡すと光のintensityがリニアになるようになっている(ガンマは2.2)。 ガンマ補正の所にあるようにこれのlineariseは場合分けした二つの関数の接続となっている。
CGから【書籍】PrinciplesOfDigitalImageProcessingのCore Algorithmの6章あたりの話で、CIE XYZとかCIE Labの話がある。 なお、MFGではCIE XYZへの変換をbuiltinでサポートしている。最近はOK Labを使うのが流行りのよう(あまり知らないが)。
RGBはCRTベースの話なので、より人間の知覚に沿った色空間が実験とかから定義されていて、それの基礎がCIE XYZ。 さらにそれをlinearになるように変換したものがCIE LuvやCIE Lab。
これらの処理を全部無視してフィーチャーとして使って、これらの変換を学習させる事は出来るだろうけれど、 それが何をしているかは理解していたいものだ。
分布仮説の論文読み
Contextual correlates of synonymy - Communications of the ACM 分布仮説の論文はこれかな?
abstractから。
Hypothesis: 単語Aの文脈と単語Bの文脈で共通の単語の割合いは、単語AとBの意味の類似度の関数である。
同じ所が本の方でも抜き出されているな。synonymyは意味の類似度の事のよう。 synonymは類義語とか同義語みたいな意味だったかな?
この論文ではfirst-orderのassocicationで意味の類似度が示される(indicated)と仮定して進める。
morphemses: 形態素
4つのコンテキスト
4つのcontextというのが挙げられているが、これは後で実際に実験の詳細で説明される。
- sentenceの中の単語(content wordsだけじゃなくfunction wordsも含む)
- sentenceの中でLorge Magazine Countによる特定の範囲の頻度の全てのcontent word
- 各sentenceで文法的な枠組みでもっともtheme wordと近い全てのcontent word
- そのthemeと関連がもっとも深いと判断された全ての単語
Lorge Magazine Countは雑誌を対象にした常用語の出現頻度調査らしい。
基本的にはコンテキストに関係無さそうな単語を排除していく事でどんどん相関は増していく。
実験手順
実験手順もなんか複雑だな。
最初は以下のように書いてあるが、
- 65ペアを作る(どうやって?)
- 全スリップを渡してそれを類似度順にならべて、その後0.0から4.0までのスコアをつけてもらう
その後に二つのグループの話が出てきて上との関係が良くわからない。
Group I
- 15被験者
- 2週間の間をあけて2つのセッションに参加
- 最初のセッションは48ペアについて類似度を判定してもらう、この48のうち36ペアは65ペアに含まれる
- 次のセッションでは65ペアについて類似度を判定してもらう
product moment correlationは積率相関係数でピアオンの相関係数の事っぽい。
この36ペアについて、最初と次のセッションの間のproduct moment correlationを求める事で、 intra subject reliabilityが計算出来る、といっている。
このsubjectは被験者の意味か。時間をあけて、他のに混ぜてもどのくらいこの類似度は同じ値(一貫している)か?という事だな。
Group IIは二番目のセッションだけやってもらった。 Group Iとはとても一致していたので2セッションに分けた弊害はあまりなさそう、という事か。
Generation of the Corpusのパラグラフでは65のtheme pairsには48の名詞があると言っている。 ペアには重複する単語があるので48個という事かな。
AとBはテーマペアがそれぞれになるように適当に選んだのかな。 AとBで別の被験者を使って例文を作ってもらう。 AとBで分けたのは同じ人であるがゆえの疑似相関を避けたかったとか。
levelingの影響
walksをwalkに統一したり、という操作をしても、単にカーブが並行移動しただけで形状は変わらない、と結論づけている。
Inference Power
似てないかどうかを判定している(synonymyがless than 3.0かどうか)。
帰無仮説としては「似てない」で、 これを誤ってrejectしてしまう(似ていると判定してしまう)ものをType I Errorとしている。
Type I Error: false positive
一人読書会ライブ、分布仮説
NMT subword
Neural Machine Translation of Rare Words with Subword Unitsの論文を読んだメモ。
単語
- transliteration: 音訳
- cognate: 同根語
- loanword: 借用語
- morpheme: 形態素
- morphology: 《言語学》形態論
- affixation: 接辞添加
- OOV: Out of Vocabulary
character copyingは人名などの固有名詞を翻訳せずそのままコピーする事らしい。
対応したい事
優秀な人間の翻訳家がはじめて接した単語でも翻訳が容易なケースが結構あり、これをNMTでも出来るようにする方法を考えたい。 以下のようなものはまぁまぁそのまま翻訳出来るという観察がある。
- 固有名詞だがアルファベットが変わる、みたいなケース(Barck Obamaをバラク-オバマと翻訳する、みたいな)
- 同根語や借用語(claustrophobiaがドイツ語だとKlaustrophobieになる、とか)
- 複雑な形態素で構成された複合語や接辞添加された語など
これらは、未知の単語をsubwordに分割して学習すればNMTがルールを学習出来て、未知の単語への対応力が増すのではないか?というのが仮説。
また、NMTは語彙サイズとテキストサイズの両方が重要だが両者はトレードオフがあるので、この辺もいい感じにしたい。 語彙サイズを増やしすぎないためにたまにしか出ないrare wordをどうにかしたいというモチベーション。
Byte Pair Encoding
二つの文字が頻出するペアの時には別のバイトを割り当ててそれを使う、という感じ。 例のコードは文字間に空白を開けたデータに対して適用してペアにしたら空白が除去される、というのを示している。 この例はどうなんだ?
基本的にはペアをカウントしていって、大きいペアを置き換える、をnum_mergesというパラメータの分だけ置き換える。
翻訳元と翻訳先を別々にBPEを求める方法と、両方を混ぜて一つのBPEを学習する方法(joint BPEと呼んでいる)を検討していて、 前者の方がvocabは小さくなるが、後者の方が分割に一貫性があるので対応を学習しやすいかも、と言っていて、 英語-ロシア語の翻訳の時にはキリル文字をラテン文字に音訳してBPEを学習したあとにそのBPEを音訳してロシア語の方のBPEを処理した、とか書いてある。
実験
実証的に試したいのは以下との事。
- rare wordや未知語に対しての翻訳を改善出来るか?
- サブワードへの分割手法ごとに、vocab size, text size, 翻訳品質 の良し悪しを比較
WMT 2015の 英語ー>ドイツ語(420万センテンス) と 英語ー>ロシア語(260万センテンス) らしい。
Unigram F1というのは、翻訳結果に出て来る単語がどのくらい解答文の単語と一致しているかを測る指標らしい。へー。
C2-50k bigram
BPE以外の分割手法として翻訳まで評価しているのはバイグラムのみ。 バイグラムはシーケンス長(トークン数)が長くなってしまうので、 頻出50kの単語(short list)は分割しない、というワークアラウンドを入れている。
この場合shortlistに入っているがvocabに入っていない単語はどうなるんだろう?UNKが振られるのかな? Table 1ではUnkは34になっているので違うか。 bigramの数は2万程度なのにshort list 5万を足すと6万9000になっているのだから、 vocabに足すのか。
分割手法の善し悪しはどうだろう?
バイグラムとBPEで翻訳品質を見ると、バイグラムの方がいいような…
shortlistの単語は一切学習できてないと思うと、なんかBPEのスコアも微妙だなぁ。
BPEのtoy(演習問題2.7)
vocabは空白が除去されたものになっている。これはもともとコーパスに空白区切りのこれらの単語が5回、2回、6回、3回あたえられた時にBPEを実行していくとどうなるか、という話だと思う。
何を理解してもらおうとしているかは正直良く分からない。
途中でestなどがサブワードとして扱われるのは正しそうにも見えるが、lowはサブワードとしてはなかなか使われない。それはw@ (</w>はこのWikiと相性悪いので単語の終わりはアットマークで代用)が一つとみなされてしまって、lowerのlowと同じに見えないから。 ただloは割と早い段階でサブワードと認識される。
est@がloよりも先にサブワードとして認識されるのはこのBPEのアルゴリズムの動きを理解する助けにはなる気がする。(BPEのBPEを置き換えるので二文字では無く3文字が置き換え対象になるメカニズム)。
あと単語の頻度に大きく依存するのもこのアルゴリズムからは予想出来る。
learn_bpeのコード
抜粋しているコードは良く意味が分からないのでいろいろ見ていったが、結局最初から見ていく必要がありそう。
まずvocabが何か?を見ていみると、まずはvocabは単語をキーにして頻度をvalueとした辞書を作っている。 単純にファイルを開いて空白でsplitしていて、ファイルの方には文章のテキストが入っている(全部小文字っぽい)。
例えば以下か。
vocab = {"the": 10, "a": 23, ...}
その後にこれを以下のように変更している。(is_byteは消してcharの方だけ残してる)
vocab = get_vocabulary(infile, is_dict, is_bytes, num_workers)
vocab = dict([(tuple(x[:-1])+(x[-1]+'</w>',) ,y) for (x,y) in vocab.items()])
sorted_vocab = sorted(vocab.items(), key=lambda x: x[1], reverse=True)
vocabはキーが
('t' 'h' 'e@')
のタプルで、値は頻度のまま、となるか。 これがtoy_bpeと違うのが酷いなぁ。
ちなみに関数の引数側でvocabと呼んでいるものはだいたいsorted_vocab。
次にindices。これは以下でstatsを一緒に作っている。
def get_pair_statistics(vocab):
"""Count frequency of all symbol pairs, and create index"""
# data structure of pair frequencies
stats = defaultdict(int)
#index from pairs to words
indices = defaultdict(lambda: defaultdict(int))
for i, (word, freq) in enumerate(vocab):
prev_char = word[0]
for char in word[1:]:
stats[prev_char, char] += freq
indices[prev_char, char][i] += 1
prev_char = char
return stats, indices
indices[pair]でdictが返り、そのキーはそのbpeが登場したwordを表すsorted_vocabのindex。valueはそのword内に幾つ入っていたか。 結構ややこしいがだいたい分かった。
ちなみにstatsはペアのfreq。
次に本を読んでいて良くわからなかったのがbig_statsとstatsの関係。 なんかstatsが同じに見えるような?
と元コードを見るとforの最後が以下だ。
changes = replace_pair(most_frequent, sorted_vocab, indices, is_bytes)
update_pair_statistics(most_frequent, changes, stats, indices)
stats[most_frequent] = 0
if not i % 100:
prune_stats(stats, big_stats, threshold)
いやいや、ここ無いと分からんでしょ!?と思ってしまうが。0を入れる事でmost_frequentは取り除いている訳だな。
replace_pairは以下みたいな感じ(多少改変している)
iterator = indices[pair].items()
for j, freq in iterator:
if freq < 1:
continue
word, freq = vocab[j]
new_word = split_char.join(word)
new_word = pattern.sub(pair_str, new_word)
new_word = tuple(new_word.split(split_char))
vocab[j] = (new_word, freq)
changes.append((j, new_word, word, freq))
new_wordはタプルをsplit_charでジョインしている。t h e@とかになる訳だな。 で、pair_strは例えばhe@なら'h e@'とか空白でつなげたものになっていて、これをhe@に置き換える。
そして最後にsplitするので、
(t, he@) というタプルになる訳か。
vocabがまずは文字ごとのタプルになって、その後にbpeで置き換えられていくんだな。ややこしい。
update_pair_staticsをちらっと見ると、これはhe@とマージしたら(t, h)のペアの頻度を下げたりしている。 当然t, he@の頻度はその分あげるのだろう。
prune_statsを見る。
def prune_stats(stats, big_stats, threshold):
"""Prune statistics dict for efficiency of max()
The frequency of a symbol pair never increases, so pruning is generally safe
(until we the most frequent pair is less frequent than a pair we previously pruned)
big_stats keeps full statistics for when we need to access pruned items
"""
for item,freq in list(stats.items()):
if freq < threshold:
del stats[item]
if freq < 0:
big_stats[item] += freq
else:
big_stats[item] = freq
freqがthreshold以下のものをbig_statsに移すとはこういう感じか。
statsから低頻度のものを一時移して高頻度だけのものを残し、その中でbpeの統計をとったり置き換えたりの処理をしていく。 statsやbig_statsはあくまで調べるbpであってvocabなどはそのまま全体を見ている。
大きい頻度のものが全部処理されてしまったりマージ処理の分かれ具合でthresholdより下になってしまったら、そもそもにbig_statsの方にもっと大きいものがあるはずなので全体を取り直してまた再計算しましょう、という事かな。マージ処理で減少するケースが本当にあるかどうかはコード動かしてみないと自信が持てないが。
まぁだいたいは理解したか。いやぁ、これは本文の解説はいまいちだな。演習問題を答えるにはちゃんと元ソースを読む必要があるので読めって事なんだろうが。
encode関数
Colab: bpe_toy.ipynb に続きとして書く。
ちなみにサポートページの菊田さんの方が途中経過のprintがあってわかりやすい。
原論文から解き明かす生成AI_演習問題2.9 - Colab
Amazonの低評価レビューの話
この本には「サブワードの出現確率は、サブワードの頻度に依存した確率のみで定まる」が意味分からん、という低評価レビューがついている。 この手のレビューに対しては著者が反論しても意味が無い類のものではあると思うが、この本を読み始める前にこのレビューを読んでいてどんなところなのかと興味があったので該当箇所を見てみる。
以下は自分が正解かどうかは不明だが自分はこう思う、という話。
該当箇所は2.4のサブワードユニグラム言語モデルのところで、原文は以下のようになっている。
「サブワードに対するユニグラム言語モデルは、サブワードの出現確率はそのサブワードの頻度に依存した確率のみで定まるという仮定の下、サブワード列t(以下数学表記で書くのが面倒なので割愛)の生成確率を次のように表現する」(以下数式なので同様に割愛)
レビューではサブワードの出現確率をこう定義すると言いたいのだろう、と言っているが、それは間違っているように思う。
この文章はサブワードへの「分割」をどう定式化するか、という方が本題であって、個々のサブワードの生成確率はおまけというかその前提になる。 だから文章としては、カッコ書き扱いとして以下のように解釈すべきに思う。
「サブワードに対するユニグラム言語モデルは、(サブワードの出現確率はそのサブワードの頻度に依存した確率のみで定まるという仮定の下)サブワード列tの生成確率を次のように表現する」
サブワードの出現確率がgivenのもとで分割の生成確率は以下のように書けますよ〜、と言いたい訳だ。
そしてこのカッコは何を言っているか、というと、ようするに「頻度から計算した値をベルヌーイ分布のミューとして使ったベルヌーイ試行として考える事にするので、条件付き確率を考える必要が無く独立した確率として扱う」というような事を言っているように見える。
特に後者の条件付き確率を考えない、というのがその次のtの式の理由になっているので、重要な所に思う。
なのでレビューの表現では条件を考えなくて良いという部分が抜け落ちているので、 本書の文章の方がより正確な表現だとは思う。 また、本書の文章の方がベルヌーイ試行との脳内でのマッピングが容易なので自分には分かりやすい。
けれど不完全な表現を書いているレビューが間違いか?と言われるとちょっと微妙な所もあり、 この本を読んだ結果そのくらいしか読み取れなかった、というのは、それ自体がレビューとして意義のあるものではあるように思う。 実際これは読解能力という話では無く、説明していない背景知識の話に思う。 それを説明していないのはそういう本だからなんだが、その結果文句を言われてもまぁ仕方ないよなぁ、とは思う。
こうした試行をモデル化する時にベルヌーイ試行が大前提にあるのは、この文章からは読み取れない。 知識が足りているかどうかを自分で判定するのが難しいので、知らない事を学ぶ本としてはいまいちという批判はあっても良い気はする。
ただsubword regularizationの論文を読むと多項分布がでてくるのでその復習のためにベルヌーイ試行を復習する必要はあって、 それを復習した後に本文を読むとこの辺の事はわかるようにも出来ている。 これを十分な説明と言うのは無理がある、というのに理解は示すが、この件に関しては表現が悪いというよりは前提知識が多いくせに明示されてない、という批判の方が正しいような気はする。
この本はようするに原論文のファンブックである(攻略本では無い)
自分が思うのは、この本は原論文のファンブックだ、というものだ。 本でなければさおりんと一緒とか初音のないしょとかああいうのだ。 雫や痕をプレイしないであの辺買っても意味が無いのと同じように、 原論文を読まずに本書だけ読んでも全く意味が無いと思う。 いや、俺は月姫は読本しか読んでないよ?という人もいるだろうけれど。
ファンブックというのは本編を一通り遊んだ人が設定資料とか原画とかを見て楽しむものであって、攻略にはあまり役に立たない。 ただ作品を好きな人がより多く愛を育むための本だ。
この本は原論文を読んで好きになった人が集まって、どこが良いかを話し合うような本である。 この論文いいよね、とか、論文のここの部分が自分は気になったんだよ、 とか、そういう話をして盛り上がる、という本だ。
それは原論文を読むモチベーションにもなるので読むのに役に立つ部分もある。 そして楽しみを増す事でより論文というものを好きになって読むのを促進するとは思う。 唯一無二の本ではあるので、こんな本もあってはいいんじゃないか。
でもたぶん世の中の人が期待してたのはファンブックではなく攻略本なのでは?と思うのだが。
著者の気になった事と自分の気になる事は違う
あと、本書は「自分はこういう所が気になってこの辺の論文のこの辺を読んだ」という話が多いのだが、 この気になる所は読者と同じとは限らない、というか普通は違う。 だからそのまま読んでもあんまり意味は無い。
こういう事が気になったらこういう所をこう読むのか、という例としては役に立つのだが、 人が気になった所というのはそれ自体は役には立たない。 自分が気になった所を解き明かす方が重要だ。
実際本書の抜粋されている所では自分が気になった所は全く分からないので意味が全く分からない。 著者は納得したんだろうが読者の自分は何も分からない。
だから、自分の気になった所は本書とは独立に解き明かす必要がある。
それを解き明かして理解した上で、はじめて本書の文章には意味がある。 なるほど、菊田さんはこういう所が気になってこう解釈したのか、と。 それは自分がある程度理解した後でないと理解出来ないし、意味も無い。
この自分の気になった所は先に自分で解き明かしておかないと本書の文章に意味が無い、というのは、読んでみるまではわからなかった事で割と思ってたのと違うな、と思った所だ。
ただ、自分が一通り理解したあとに読むと本書はなかなか面白い。 面白いので書籍としての価値はあるのではないか、という気はする。
あと著者がこういう所が気になってこういう風に読んだ、というのは、メタなレベルではそれなりに参考にもなる。 というかそういう事を参考にしたり自分との違いや同じ所を楽しんだりするのが正しい本書の楽しみ方に思う。
でもそれって論文読んで理解した後なので、相当暇人向けの本だよな〜という気はする。 なお、私は相当暇人である。
演習問題 2.10
貪欲法よりビームサーチした方がいい例。ようするに後とつながった方がいいのに最初に大きくしすぎるような例であれば良い。どんなのがあるかな?
「的あて」とかどうだろう?「遠距離的あて」とかを、遠距離的とgreedyに分割してしまうと最後のあての確率が低くなるようなケースだと、 ビームサーチ2でやれば「遠距離」と「的あて」に出来る気はする。
読書会ライブ2章-2
- 一人読書会ライブ: 原論文から解き明かす生成AI、2章の2、サブワード分割 - YouTube
- 一人読書会ライブ: 原論文から解き明かす生成AI、2章の2、サブワード分割、ユニグラム言語モデル〜 - YouTube
参考リンク