文字に“穴”をあけて学ぶAI:写真のノイズ直し(VAE+DDPM)から、文字の穴うめ(離散拡散)へ
写真ではこれまで、VAE+DDPMで「ザーッというノイズ」を入れて元に戻す練習をしてきました。
こんどは文字の世界。文字は“音”や“色”がないので、**ノイズの代わりに穴(<mask>
)をあけて、正しい文字で埋める練習をします。これを離散拡散(マスク)**の学び方と呼びます。
かんたんイメージ
- 写真:ノイズを入れる → ノイズを消して元の写真へ(連続の世界)
- 文字:ところどころを
<mask>
にする → 正しい文字でうめる(離散の世界)
どう学ぶの?
- 文やコードの一部を
<mask>
にして隠す - AI が「ここは何の文字(トークン)?」と当てる
- **穴の数(むずかしさ)**を少しずつ増やして、だんだん上手になる
今日はミニ実験
とても小さな3つの関数(add / factorial / fibonacci
)だけで練習して、
左から右へ少しずつ書く(L2R) 生成を試します。
実験コード(Tinyデータで学習→L2R生成)
元々の関数を三つだけ覚え込ませました。
tiny_samples = [
"""def add(a, b):
return a + b
""",
"""def factorial(n):
if n <= 1: return 1
x = 1
for i in range(2, n+1): x *= i
return x
""",
"""def fibonacci(n):
if n <= 1: return n
a, b = 0, 1
for _ in range(n-1): a, b = b, a+b
return a
""",
]
実際にこれらのコードにルールを決めてマスクをかけて穴埋め問題にします。これを復元するように生成すると、手元のPCでも簡単にできます。
=== L2R: fibonacci ===
def fibonacci(n):
if n <= 1: return n
a, b = 0, 1
for _ in range(n-1): a, b = b, a+b
return a
onacci a _onacci n a range
range range bonacci range = range n b a
= for rangeonacci
=== L2R: add ===
def add(a, b):
return a + b
return n
a, b = 0, 1
for _ in range(n-1): a, b = b, a+b
return a
onacci n _
a a range-
本当は後ろの方はいらない気がしますが、細かい調整ができなかったので余計な文字も生成されてしまいました。
今回はpytorchでフルスクラッチで作ってみました。
まとめ
- 写真は「ノイズを消す」練習(VAE+DDPM)。
- 文字は「穴をうめる」練習(離散拡散:マスク復元)。
- まずは小さな3題で試して、うまくいったら大きな文章にも広げていきましょう。