埋め込みモデルの精度が上がるとどうなるか

今日は小ネタ。

OpenAI の text-embedding-ada-002(以下 ada-002) と text-embedding-3-small/large(以下 3-small) はテキストを埋め込みベクトルに変換するモデルの代表格で、3-small は ada-002 より精度が高いと言われますが、埋込モデルの精度が高いってどういうことだろう、という話。

埋め込みベクトル同士のコサイン類似度を計算することでテキストの意味の類似度がわかる、というのが埋め込みモデルの売り文句ですが、実際には意味だけではなく表現の近さもかなり反映されます。最も顕著な例は言語でしょう。別の言語だが同じ意味のテキストより、別の意味だが同じ言語のテキストのほうが、埋め込みベクトルの類似度が大きいことも珍しくありません。

こうした事情から、例えば RAG を使ったシステムを構築する場合、複数の言語が混じったテキストをデータベースとするのは気をつける必要があります。もし精度の低下が大きいなら、データベースを言語ごとに分けてベクトル検索をしたほうがいいかもしれません。

さて話を戻って、この意味より言語の一致が勝つ現象について、ada-002 と 3-small を比較してみましょう。具体的には、ベースとなるテキスト「彼は会議に出席した」に対して、いくつかの類似候補文とのコサイン類似度を計算してランク付けします。候補文の中には英訳 "He attended the meeting" と、「彼は仕事に出かけた」「私は総会に欠席した」などのちょっと違う文、「私はネコが好きだ」などの全く違う文を含めておきます。

まずは ada-002 の結果です。

1.00 彼は会議に出席した
0.97 彼女は会議に出席した
0.93 私は総会に出席した
0.92 私は会議に欠席した
0.91 彼は仕事に出かけた
0.90 私は総会に欠席した
0.87 He attended the meeting
0.81 彼はネコが好きだ
0.77 私はネコが好きだ

英訳 "He attended the meeting" より類似度が低いのは「ネコが好き」しか無く、明らかに意味より表現が勝っています。

一方 3-small ではこうなりました(3-large だと数値は少し変わりますが、同じランキングになります)。

1.00 彼は会議に出席した
0.90 彼女は会議に出席した
0.73 私は総会に出席した
0.70 私は会議に欠席した
0.66 He attended the meeting
0.61 私は総会に欠席した
0.45 彼は仕事に出かけた
0.25 彼はネコが好きだ
0.11 私はネコが好きだ

"He attended the meeting" のランキングが上って、「彼は仕事に出かけた」などには類似度で勝てるようになりました。特に「ネコが好きだ」の類似度は大きく落ちており、明らかに意味が異なるという直感が反映された数値になっています。

一方で、冒頭の例にも挙げた「私は会議に欠席した」はまだ同じ意味の英訳に勝っており、埋め込みベクトルの近さに意味だけではなく表現も強く反映されることは変わってはいませんし、この1つの例がすべての傾向を説明できるわけでもありません。ともあれ、この例は埋め込みモデルの精度向上をわかりやすく実感しやすいんじゃあないかと思います。

ちなみに冒頭の図は拙著『ChatGPTのしくみ~』に掲載したものです(書籍の図はデザイン会社さんがきれいにしてくれたものになってます)。執筆当初は ada-002 を使い、同じ意味の英訳に勝つテキストとして「彼は仕事に出かけた」を例示していました。ところが執筆途中で 3-small/large が出て、念の為類似度を計算してみたら逆転してて、慌てて他の例文を探す羽目になりました(苦笑)。

shuyo.hatenablog.com

ChatGPTのしくみと哲学

「図解即戦力 ChatGPTのしくみと技術がこれ1冊でしっかりわかる教科書」、いよいよ本日発売です。

shuyo.hatenablog.com

本書は以下の8章から構成されています。目次からもわかる通り「ChatGPTの本」というより「ChatGPTのしくみ(や背景や歴史的経緯)の本」ですね。

  1. ChatGPT
  2. 人工知能
  3. 機械学習と深層学習
  4. 自然言語処理
  5. 大規模言語モデル
  6. トランスフォーマー
  7. APIを使ったAI開発
  8. 大規模言語モデルの影響

一般的な ChatGPT の入門書ではプロンプトエンジニアリング(役に立つプロンプト)などが手厚く扱われていますが、本書では触れてはいるものの、あくまで「ChatGPTのしくみ」からわかる範囲や、「ChatGPTのしくみ」の説明に役立つ内容しか扱っていません。そうした、他の本に書いてありそうなことは任せてしまおうと割り切って、「広いけど、浅さをあまり感じさせない本」を目指しました。

さて本書の8章では、「AIと哲学」というセクションで現在のAIの大きな進展と哲学との関連について少し触れています。実は手元の原稿では、AIと哲学のセクションは調子に乗ってもっと長く色々書いていたのですが、なにぶん哲学はまだまだ勉強中なもので、ブログならツッコミをもらうこと前提で書けそうなことでも、紙の本にはまだ厳しいかな……という内容を削っていくと、今の分量になってしまいました。

で、今言った通り「ブログならツッコミをもらうこと前提で書けそう」ということで、書籍のボツ原稿から2個の話題をブログ向けに手直しして掲載します。書籍の「中国語の部屋」の項の続きだったので、それに対する代表的な批判と反論の話から始まっています。書籍をお持ちでない方は Wikipedia の記事 中国語の部屋 - Wikipedia などを御覧ください。


AIと身体性

中国語の部屋」はAIが知能を持たないことを主張する思考実験でした。その骨子は、詳細な中国語の応答マニュアルを使ってメッセージのやり取りができたとしても、それが言葉を理解していることを意味しない点でしたが、それはむしろ外部から知能や意識の有無を判別する方法がないことを示している、という批判を受けました(詳細は「図解即戦力 ChatGPT~」8章を参照)。

この批判への代表的な反論の1つが、AI にはもともと「自己」がないから意識もなく、したがって「中国語の部屋」が意識の有無を判定する必要はないというものです。「自己」とは、世界と自分を区別するもので、そのためには「ここからここまでが自分である」と明示する「身体」がなければならず、AI がそれを持たないことは自明であるという主張です。要するに、「AIには身体がないから知能ではない」ということです。

この主張の真偽はひとまず置いといて、現在の大規模言語モデルや生成AIにあてはめて考えてみます。ChatGPT や Midjourney には確かに「身体性」は無いでしょう。ただ、「ChatGPT には身体がないから知能ではない」というのは個人的には違和感を感じます。「AIには身体がないから知能ではない」は(消極的)OKだが、「ChatGPTには~」になるとうなずけないという人は他にもいるんじゃあないかなという気がしています。

その違和感の正体を考えてみると、これまではあくまで思考実験に基づく議論であり、「AIには身体がないから知能ではない」の対象となる「一見知能が有りそうなAI」は現実には存在しませんでした。人間は、存在しないものには想像力や判断力が必ずしもうまく働きません。

一方、ChatGPT という「一見知能が有りそうなAI」が現実に登場し、人間と自然な会話を行ったり、数学の問題を解いたりができるようになると、「ChatGPT が知能を持たないのは、身体がないからである」というロジックに「それ本当か?」という感覚を持ってしまうのではないかと考えています。「数学の問題を解く知能は、身体を持つ必要がある」とは思えません。「仮にChatGPTに知能がないという結論になるとしても、その理由が『身体がないから』というのは納得いかない」とも言い換えられます。

このような違和感が直ちに ChatGPT が知能を持つことを示すわけではもちろんありませんが、「思考実験としての中国語の部屋」に基づく議論と、ChatGPTという「現実に動く中国語の部屋」に基づく議論では様相がかなり変わってきうるので、生成AI以降の世界であらためて「中国語の部屋」やそれを発展させた議論を行う必要があるのでは、というのが個人的な印象です。

ここでは「身体性」が知能の必要条件であるような主張への(個人的な)違和感を書き連ねましたが、「身体性」が知能の条件であることを認めたうえで、そこで行われる議論の妥当性や、「反論への再反論」などは戸田山和久『哲学入門』(2014,ちくま新書)に詳しく紹介されています。

大規模言語モデルは「知能」か?

AIが知能を持つことはありえないという主張の一番極端なパターンは、知能はタンパク質にしか宿らないのだから、シリコン仕掛けのAIは知能ではない、というタンパク質を神聖視するタイプの主張です。実はこの主張を真にするのは簡単で、タンパク質によって実現されていることを「知能」の定義に採用してしまえばいいのです。

というのは半分冗談ですが、それを実現しているデバイスの物理的な特性と概念そのものとが無関係とは言い切れないのも事実です。身近な例で言えば、手書き文字とタイプライターの文字、アナログレコードとCD、フィルムカメラデジタルカメラのように、カテゴリーとしては同一であっても、片方がもう片方で完全に代替されないものは数多くあります。

この観点に立てば、人間の天然知能とAIの人工知能を包含しうる、物理デバイスによらない抽象的な「知能」の概念が必要なのかもしれない、と感じさせてくれます。

また別の観点にも立ってみましょう。AIはシリコンチップ上で電気のビットを立てたりしているだけであり、意味を理解して動いているわけではないので、汎用人工知能は絶対に実現することはない、と言った主張をされる人もいます。「中国語の部屋」を唱えたジョン・サールもこのタイプの主張を行っています。しかし人間の知能の多くの部分はニューロンの集合によって実現されていることは間違いないところでしょうが、個々のニューロンが意味の理解や、人間の身体の把握をしているともやはり思えません。つまり、「知能らしき何か」を実現している物理デバイス(脳やコンピュータ)の部品が意味を理解しているかどうかは知能の条件とするべきではないということです。

人間は2000年以上哲学を続け、さらに神経科学の研究も加えて、それでもまだ「意味とは何か」について決定的な回答を得ていませんし、脳がどうやってそれを処理しているのかについても解明には至っていません。それなのに脳は仕組みがわからないけど意味を理解しているし意識もある、AIは仕組みがわかっているから意味を理解しているはずがないし意識もない、という主張は公正ではないと個人的には思います。

バイスのミクロな挙動が知能の条件ではないとしたら、何に議論のよりどころをもとめるべきでしょう。「意味」について決定的な回答は無いと言ったばかりですが、それでも哲学(言語哲学)は「意味とは何か」についてさまざまに議論を重ねています。その1つに哲学者のウィトゲンシュタインが唱える「意味の使用説」(Meaning as use)があります(ウィトゲンシュタイン哲学探究』)。

「意味の使用説」は、意味はその言葉がどのように使用されるかによって定まるという主張です。その主張の解釈はさまざまあるのですが、文字通りに「言葉を使うことで意味が定まる」と解釈するのが一般的です。そして、ChatGPTは言葉を使えている、つまり意味を定め、扱うことが出来ているわけです。この観点においては、大規模言語モデルは「知能」たりえる、と主張することが出来ます。

ただこれも厳密に考え出すと、「では、言葉を使うとは?」という、まさに哲学的な議論に遡っていくので、これもまた ChatGPT が知能を持つ決定的な証拠ではもちろんありません。こういう複数の議論を知ることで、「AIに知能がある or ない」「ChatGPT は汎用人工知能である or ではない」といったどちらかの結論に短絡的に飛びつかないようになってくれれば嬉しいです。

(追記)ツッコミいただきました

yudukikun5120.hatenadiary.jp

最初に「ツッコミをもらうこと前提」と書いた通り、ツッコミをいただけました。ありがとうございます!

ツッコミの内容はリンク先の記事をご覧いただきたく、この記事の良くない部分はそれはそれとして残しておこうと思います。

ただ「知能と言語使用の間の関係がよく分からない」というご指摘は100%その通りなので、上の記事の該当部分は取り消し線を引いておきました。

GPTの文生成を樹形図で描く

拙著『図解即戦力 ChatGPT~』では、大規模言語モデルの文生成の様子を観察できるように、以下のような単語の生成確率による樹形図*1を掲載しています。

図の枝は次の単語とその生成確率を表し、それぞれの単語のあとにまた続く単語確率の高い単語をつなげることで樹形図の形になっています。枝は上から確率が高い順に並んでいるので、常に一番高い確率の単語(一番上の枝)を選ぶと(貪欲法)、 "Artificial intelligence is a branch of computer ..." という文が生成されることがわかります。

これらの単語と確率は適当に決めたものではなく、実際の OpenAI API の出力から構成しています。OpenAI の Completions API では logprobs という単語の確率(温度=1)が取得できるので、細切れに文章を与えては GPT-3.5(gpt-3.5-turbo-instruct) で続きの文生成を行い、その単語確率を得て図を構成しています。こういうのはやっぱり本物のほうが説得力段違いですからね。

このような樹形図を1回だけ描くのなら、APIの結果から手動で作図してもよかったでしょうが、色々なパターンで描いてみたかったので、樹形図の根本に当たる書き出しの文字列と、樹形図の形(枝分かれの本数)を与えると、樹形図の Graphviz ファイルを出力するスクリプトを作りました(スクリプトはそれなりに長いので記事の末尾に掲載しています)。

書籍に掲載できる手頃な大きさの図で、文章(の書き出し)としてある程度の自然さを持ちながら、ビームサーチの説明に使えるよう「貪欲法で選んだものよりビームサーチのほうが最終的なスコアが高い枝がある」例に当たるまで、結構試行錯誤しています(笑)。例文が "AI is" でも "Artificial Intelligence is" ( I が大文字) でもなく "Artificial intelligence is" なのはその調整の結果ですね。

他の書き出しで作った樹形図もサンプルとしてあげておきましょう。"I am" と "Once upon a time" です。紙面では大きさに自ずと制限がありますが、ブログならいいだろうとちょっと大きめの樹形図にしています。クリックしただけで読めるほど大きくならないときはダウンロードして見てください……。


これを見ると、「日本語でやったらいいのに」と思うでしょう。スクリプト自体は日本語でも一応動くのですが、実は残念ながらあんまりうまくいきません。まずは論より証拠で実際に日本語で試すとどうなるか見てもらいましょう。

英語ならほとんどのノードに単語が対応する、イメージ通りの樹形図になるのですが、日本語ではこうなります。Completions API で使える GPT-3.5 では日本語は1トークンあたり 0.9文字程度しかないため、良くて1ノード1文字となり、この程度の深さの樹形図では文章と呼べる長さにだいぶ足りません。

さらに、UTF-8のバイト列が文字未満に分割されて、壊れてしまうこともよく起きます(図の bytes:~ となっている部分)。このスクリプトでは、各ノードまでの文字列を結合して、その続きを Completions API で生成させていますが、UTF-8 として不完全な文字列を与える方法がないため、それ以降の生成は壊れてしまっています。UTF-8としてvalidになるまでを1ノードにまとめる処理を頑張れば解決可能ですが、かなり面倒な処理になる上、「せいぜい1ノード1文字」は変わらないため、諦めました。

せめて GPT-4o が使えれば、1トークン 1.2~1.3文字くらいになって、単語で出てくる割合が増え、文字未満に分割される確率も少なくなるのですが、OpenAI Completions API は legacy となっていて、gpt-3.5-turbo-instruct 以降モデルが追加されることもないので、望み薄です……。シンプルに続きを生成する API は工夫次第で色んな使い方ができて、とても有用なんですがねえ。

文生成樹形図スクリプト

以下が樹形図の Graphviz ファイル(.dot) を生成する Python スクリプトです。
先頭の root に文生成の起点となる文字列の先頭、WIDTH に樹形図の各深さごとの枝の数を指定してください。WIDTH = [3,3,2,1] の場合、深さは4で、最初と2番目が3本に分岐、3番目が2本に分岐、4番目は1本だけとなります。
生成された input.dot は Graphviz で dot -O -Tpng input.dot などとして画像に変換してください。
日本語を含む Graphviz ファイルをレンダリングするときは、dot にオプション -Nfontname="MS Gothic" -Efontname="MS Gothic" -Gfontname="MS Gothic" など日本語フォントの情報を渡してください。

root = "Artificial intelligence is"
WIDTH = [3,3,2,1]
DEPTH = len(WIDTH)

import numpy, itertools
from openai import OpenAI
client = OpenAI(api_key="sk-********************")

def gen(text, tokens):
    print(f"gen: '{text}', {tokens}")
    return client.completions.create(
        model="gpt-3.5-turbo-instruct",
        prompt=text,
        max_tokens=tokens,
        temperature=0,
        logprobs=5
    )

dot = f"""
digraph G {{
  rankdir="LR";
  nodesep=0.05;
  ranksep=0.4;
  node [shape=plaintext fontsize=18];
  edge [arrowsize=0.5];
  Root [label="{root}" fontsize=20];

"""

d = dict()
def subtree(head, width):
    text = root
    for i in range(len(head)):
        text += d[head[:i+1]][0]

    response = gen(text, len(width))
    top_logprobs = response.choices[0].logprobs.top_logprobs
    for logprob, w in zip(top_logprobs, width):
        z = [(x, y, head if head!="" else "Root") for x, y, in logprob.items()]
        for i in range(w):
            d[head+chr(65+i)] = z[i]
        head += "A"

subtree("", WIDTH)
for k in range(1, DEPTH):
    for x in itertools.product(*[range(w) for w in WIDTH[:k]]):
        if x[-1]==0: continue
        head = "".join(chr(65+i) for i in x)
        subtree(head, WIDTH[k:])

for n in d.keys():
    x = d[n]
    dot += f'  {x[2]} -> {n} [label={numpy.exp(x[1]):.3f}]; {n} [label="{x[0].strip()}"];\n'

    if len(n)==DEPTH:
        score = numpy.exp(numpy.mean([d[n[:i+1]][1] for i in range(DEPTH)]))
        dot += f'    {n} -> {n}s [style=invis weight=5]; {n}s [label={score:.3f}];\n'

dot += f'  {{ rank=same; score {"A" * DEPTH}s }}\n}}'
with open("input.dot", "w", encoding="utf-8", errors="backslashreplace") as f:
   f.write(dot)

*1:書籍の図は制作会社さんがレイアウトしなおしているので、見た目がちょっと違います。

「図解即戦力 ChatGPT」~ ChatGPTと大規模言語モデルの仕組みの入門書

9月24日に「図解即戦力 ChatGPTのしくみと技術がこれ1冊でしっかりわかる教科書」という本が出ます。タイトルは ChatGPT ですが、中身は大規模言語モデルの仕組みを解説する本になっています。

gihyo.jp

ChatGPTなどのAIを扱った入門書はすでに数え切れないほど出ており、何番煎じ? 柳の下にもうドジョウ残ってないでしょ? と突っ込まれたら返す言葉もないですが(苦笑)、同じジャンルの他の本とは異なる特長を備えるように書いたつもりです。

大規模言語モデル(生成AI)は情報科学機械学習自然言語処理、数学などさまざまな技術や分野が複合した複雑な体系を持ちます。そのことを指して「大規模言語モデル総合格闘技」とも言われたりします。しかし、実際に『総合格闘技』として扱った入門書、つまり関係するさまざまな技術にわたってAIを解説する書籍はあんまり見たことがない気がします。

本書では大規模言語モデルの入門として定番のトランスフォーマーや注意機構の解説はもちろんのこと、文字コード浮動小数点数といった情報処理の基礎の基礎から、自然言語処理言語モデルや、機械学習のロス(損失)や勾配法、大規模言語モデルの倫理や哲学的な問題まで解説しています。ChatGPTとタイトルに大書しつつ Unicode を説明している本もなかなかないでしょう(笑)。

ただし、数学は本書で扱っていません。数学をカバーするとさすがに 300ページを大きく超えるのと、対象読者が狭まってしまうので、目をつぶりました。

ところで、大規模言語モデルの仕組みを理解することがなんの役に立つのでしょう? ChatGPT をはじめとした生成AIは、自然言語で指示を行えるようになったおかげでAIの専門家でなくても使えるようになりました。このように誰でもAIを使えるようになることを『AIの民主化』と言います。つまり、ChatGPT を使うのに仕組みなんかわかって無くてもいいはずです。

仕組みがわかっていると嬉しい理由は、大規模言語モデルが今後どのような発展をする可能性があるか、その未来や制限を推測できるようになることです。もうちょっと具体的で直接的なメリットで言えば、ChatGPT で期待する答えを得るにはどう使えばいいかをある程度方向づけることが出来たりします。

題材にちょうど良い記事がはてなブックマークの昨日のホットエントリに入っていました。

anond.hatelabo.jp

128Kトークンという巨大な入力コンテキストウィンドウを持っていることになっているが、これは殆ど嘘、ごまかしであり、出力を高速化するために「渡されたものの前のほうだけ読んで適当に回答する」ということをやってくる。

ChatGPT(GPT-4o)に長い文書を放り込んで「なんて書いてある?」と聞いたときに期待する答えが返ってこなかったことを指して、上のような感想を述べた記事ですが、大規模言語モデルの仕組みや注意機構の特性がわかっていれば、それは大規模言語モデルが本質的に得意ではないタスクだが、うまく指示をすれば期待した答えに近づけられるだろうと想像できるようになります。

大規模言語モデルの中核技術である注意機構とは、必要な部分に注目し、それ以外を適切に無視する仕組みです。そのため、「まんべんなく文書全体を見る」タスクは苦手なのです。単純に文書要約を指示すると「まんべんなく文書全体を見る」ことを求めてしまうので、これを注意機構の仕組みに合わせて「部分を見ることを必要なだけ繰り返す」ように指示し直せば格段に精度が上がります。

一番シンプルには、「要約して」を「セクションごとに解説して」に言い換えるだけでもかなり良くなります。文書のテーマが多少なりともわかっていれば、「以下のテーマそれぞれについて書かれていることをまとめてください。・テーマ1・テーマ2・……」と具体的に指定するのもいいです。上の記事の中でも「テキストを分割して適切なサイズにしてから渡していって最後にその結果を統合する」という対策が書かれていますが、それを自分の手でやるのではなくLLMにやらせればいいんです。

記事のコメントでGPT-4oよりClaudeの方がこうしたタスクに向いているとかもありますが、確かに実感として Claude の方がGPT-4oより「まんべんなく文書全体を見る」タスクが得意という印象があります*1。ただ注意機構自体がそういうタスクが苦手であるという本質は変わらないので、Claudeでも「セクションごとに~」のような対策をしたほうがおおむね精度が上がります。

他にも「typoを見つけて」みたいな指示も「まんべんなく文書全体を見る」タスクなのでうまくいきません。これも「セクションごとに~」と付けてもいいですが、もっと単純に再生成を繰り返す(ChatGPT 等の再生成ボタンを何度も押す、APIなら同じプロンプトで複数回呼び出す)ことで「部分を見ることを必要なだけ繰り返す」を実行してしまうという手もあります。何回もやっていれば、ランダム性によってそのうち注意機構が typo のところにヒットするだろうと期待するわけですね。

本書の校正でも、この方針で4回くらい再生成したら、「ベクトルが直行する」(直交の間違い)や「CharGPT」(なんでか Chat が Char になってた……)など多数の typo を ChatGPT が発見してくれてめちゃくちゃ助かりました。こういう間違いは間違っているという目で見ないと見つけられないんですよね……。

ちなみに大規模言語モデルが「前のほうだけ読んで適当に回答」する傾向もよく知られており、"Lost in the Middle" という名前がついています(本にも書いていますw)。この現象の原因も現在主流の大規模言語モデルの仕組み(自己回帰性&注意機構)から類推がつきますが、さすがに長くなるので機会があったらまた。

*1:なおGPT-4oの前のGPT-4はこの手のタスクが壊滅的にダメでした……。GPT-4oで劇的に改善したので、チューニングやっぱり大事だな、などと仕組みを想像して感心することも出来ます(笑)。

「褒められなくても好きだからやる」プログラミング漫画

王道ではないプログラミング漫画 - 木曜不足の続き。漫画の中身の話。

プログラミング漫画『ぺたスクリプト』には、プログラマーってこういう生き物だよな~という自分の経験や体感をあれこれ盛り込みました。

小学生のときにNHKの『マイコン入門』で覚えた BASIC を、電気屋に並び始めたコンピュータ(今で言うパソコンですが、当時は「マイコン」と呼んでいました)に入力するのが最初のプログラミング体験でした。当時は気の利いたデモ画面やスクリーンセイバーなどもなく、電源を入れただけの BASIC のプロンプトで放置(展示)されていたので、プログラムが入力し放題でした*1

とはいえ、プログラミング初心者が店頭でゼロから入力できるプログラムなどたかが知れていて*2、簡単な数当てゲームや、

10 PRINT "アホ ";
20 GOTO 10

みたいなプログラムを実行して、画面が「アホ」で埋まるのを友達と一緒に指さしてゲラゲラ笑い合う、みたいなしょうもないことをしていました。今のScratchでも、ネコに変な言葉喋らせてゲラゲラ笑うとか是非してほしいんですよね。

役に立つものとか、おもしろいゲームを作るとか、プログラミングでなにか意味のあることをさせようとするのではなく、おこずかいを増やしてもらうため、宿題をサボるため、給食の残りを賭けたじゃんけんに勝つため、宿題をサボるため(2回目)みたいな嬉しいのは自分だけなプログラミングでもいいんじゃないかと。

しかしプログラミング必修化の時代ともなると、そういう変なことをしたら怒られたり(まあ宿題サボったら普通に怒られるでしょうが)、「習ってないことをするな」と厳しく注意されたりしないかがちょっと心配です*3。学校の宿題でプログラミングをやらされたり、授業でやっていないことをすると怒られたりすると、それ以外のことはしなくなって、プログラミングはつまらないと感じてしまいそうです。

前回の記事でも扱った王道系のプログラミング漫画(に限らずノウハウ系漫画全般?)では、基本的には怒られたりすることはなく、ちょっとプログラミングが進んだら、すごいね、やったね、と褒めてくれます。

でも実はそこもちょっと気になっていて、現実にはそんなに都合よく褒めてくれる人はいないし、好きなら褒められなくても、怒られても、けなされても、やめないですよね。

かつてはコンピュータは金持ちの道楽扱いで、プログラミング(プログラマー)には市民権がなく、迫害に近い扱いをされていました。プログラミングが趣味だと言ったらネクラ&キモい、プログラミングを仕事にしたいと言ったら、それだけはやめてくれと親に懇願されたほどです(実体験)。

別に先見の明があったわけではなく、プログラミングがただただ好きだっただけなので誇ったり恨みに思ったりとかは全然なく、でもそうした経験から「褒められるからやる、褒められないからやらない」は危険だな、と思うのです。「褒めて伸ばす」とはある意味真逆の、怒られようがけなされようがプログラミングをやめない漫画だってあってもいいはず。

なので、漫画『ぺたスクリプト』の主人公のアキラはプログラミングで褒められることなんてほとんどなく、怒られたり、お小遣いを減らされたり、反省文を書かされたり、あれやこれやヒドイ目にあいます。まあ怒られそうなことばかりやっているので当然ですが(苦笑)。

それでも次の瞬間には「ぺたスクリプト、サイコー!」「それ、ぺたスクリプトでできるよ!」と、プログラミングで何ができるかばかり探している。そんな漫画があってもいいんじゃあないかなあ。

*1:その一方で、SHARPのMZシリーズのように電源を入れただけだと何もできないコンピュータもあって、ナイコン族(高価なコンピュータを持っていない人をそう呼んでいました)には忌避されていました。しかしあれはプログラムをテープからロードするのを待っている状態で、「BASICのプログラム」をロードしたらBASICが使えるようになると後に知り、「へー、BASICもプログラムなのか! いつかBASICそのもののプログラムを書いてみたいなあ」と思い、その10ウン年後にX68000で「ぺけBASIC」というBASICインタプリタを書いてその夢を叶えました。

*2:たまに怒られて追い払われたりもしました(苦笑)。

*3:うちの娘が低学年だったときには、自分の名前を漢字で書いたら、まだ習ってない漢字だとバツされたことがありました……。

王道ではないプログラミング漫画

2017年に『ぺたスクリプト』というプログラミング漫画を上梓しました。一言でいうと、「日常的なちょっとした困り事をプログラミングで解決する、実際に作れそうな『キテレツ大百科』」です。

創作は作品の中で語らないといけない気がして、積極的な宣伝や説明をしてなかったのですが、出版されて7年経つし、そろそろいいかな、という感じで創作意図や裏話をまとめておきます*1

もともとの経緯としては、学習指導要領の改定で2020年度から小学校でプログラミングが必修となることを受けて、技術評論社さんにて小学生向けのプログラミング漫画の企画が立ち上がったとき、高校時代は文芸部で、その後も趣味で小説や漫画を書いていた中谷に原作のお話をいただきました*2

プログラミング漫画と言って真っ先に思いつくのは、まずは「ゲームで遊びたい子が、パソコンでプログラミングすれば自分の好きなゲームが作れることを知り、褒められながら少しずつ完成させていく」という、すがやみつる先生の『こんにちはマイコン』から脈々と続く王道パターンです。もちろんその王道パターンを最初に検討しつつも、比較的早い段階で他のパターンを探すことにしました。

理由の1つ目は、プログラミング必修化の流れから他の出版社からも同種の漫画が出ることが予想されたことです。実際、同じ2017年に王道パターンのプログラミング漫画が複数出版されました*3。王道パターンは、なにしろ王道なだけあって決して悪くはありませんが、しかし、似た傾向の本がかぶることがあらかじめ予想されるなら、他に行くのは自然な発想ですよね。

王道パターンを採用しなかった理由はネタ被り以外にもあります。王道パターンの場合、その対象読者は「ゲームとプログラミングに興味がある子供」となります。そもそもプログラミングに興味のある子供しかプログラミング漫画を手に取ることはないでしょうし、ゲームはプログラミングのもっとも代表的な入口ですから、とても順当と言えます。なにしろ、自分自身もまさにゲームへの興味からプログラミングを始めた人間でしたし。

ただ、プログラミング必修化の時代になると、プログラミングに興味のない子供がプログラミングに触れることになります。ゲームを遊ぶことには興味があっても、それを自分で作ることには全く興味がない子供もいるでしょう*4。その子たちが王道パターンのプログラミング漫画を手に取ってくれると期待するのはちょっと無理がある気がします。ゲームに興味がない子供にも、というか、ゲームに興味がない子供にこそ読んでもらいたいのです。

さらに王道パターンを採用すると、「パソコンの前で座っているシーン」が多くなりがちという難点もあります*5。まあプログラミング漫画としては必然なのかもしれませんが、もし可能ならそれも根本的に解消したいと思いました。

つまり、

  • プログラミング漫画だけど、パソコンを使わない。
  • テーマはゲーム以外。広く興味を持ってもらえるように、日常に即したものが望ましい。

という、まあまあの無理難題です。でも、この方向で数日考え続けて閃いたのが、「Scratch の部品そっくりのシールを貼ったら、そのモノがプログラム通りに動く」という、ちょこっとファンタジーなアイデアでした。



これでプログラミング漫画だけどパソコンを登場させる必要がなくなりましたし、場面もパソコンの前だけではなくどこでも好きな場所が選べるようになりました*6

テーマについては、以前見てすごく感心したツイートがあって、こういうのがやりたいなあというのは企画が動き始めたかなり早くからありました。シールのアイデアのお陰で、こういうネタもものすごくやりやすくなりました。

またこのアイデアで思わぬ嬉しいことが1つありました。プログラミングなんかしたこと無い人から、「ぺたスクリプトがあったら楽できるのに~と思うことがちょいちょいある」って感想をもらえたんです。

ぺたスクリプトがあったら……と思った瞬間にはもうプログラミングしているということですよね。完成はしてないかもしれませんが(笑)。プログラミング漫画をパソコンから開放したいという発想から生まれたアイデアでしたが、現実のプログラミングもパソコンから開放できてたのか、と ものすごく嬉しかったです。

次回は、漫画の中身についてのお話。

*1:間もなく次の自著が出るので、一種の棚卸しとも言えます。

*2:漫画も描いていいと言われましたが、さすがに商業レベルの腕ではありません……。

*3:「まんがでプログラミング 進め!けやき坂クリエイターズ」はScratch 3.0 対応の新装版で、2017年時点では「はじめてのプログラミング」という名前でした。

*4:今のゲームは高度すぎて、作れそうな感じが全くないのも関係するかも。

*5:こんにちはマイコン」や前掲の2冊は、主人公がゲームの世界に入ってプログラミングの説明をする空想シーンなどを入れることで、「パソコンの前で座っているシーン」を減らす工夫が見られます。そこまで含めて王道パターンと言ってもいいかもしれません。

*6:と言いながら、漫画の舞台のほとんどが家と学校だった……。もっと色んな場面を出したかったです。

「論理処理が必要と思ったことが確率処理でできるとわかった」のは AI だけだろうか

2004年ごろに Google の猫で深層学習が一躍脚光を浴びたとき、画像認識は特徴抽出が難しいので深層学習で良い結果が出るが、自然言語処理は特徴量*1がリッチなので、深層学習を適用するのは難しいだろうと思っていた。
特徴量がリッチとは、例えば「ホームラン」のたった1語でその文はスポーツ、特に野球の話題である可能性が高くなる、みたいな話である。一方、ピクセルの1つが緑であることから何の画像か当てるのは不可能だ。
その後、自然言語処理でも深層学習が当たり前になったのは誰もがご存知のとおりであり、自身の不明を恥じるばかりだ。ただ言い訳をさせてもらえるなら、自然言語処理のえらい先生方も同じように言っていたのだ。

2014年ごろ、LSTM などの深層学習モデルが発展し、自然言語処理でも目覚ましい結果が出始めた。機械翻訳など多くのタスクで、人間の平均といい勝負になったのもこの頃だったと思う。すると、人工知能はもうすぐ人間に追いつき追い越すのでは、という話になってくる。いわゆるシンギュラリティというやつである。
しかしこの頃の論調としては、仮にシンギュラリティが来るとしても、どんなに早くても10年でなんとかなる話ではなく、いいとこ30年くらい先の話じゃあないか、という人が多かったんじゃあないかと思う(一部の気の早い人を除く)。他ならぬ自分もそうだったし。

大脳に含まれるニューロン神経細胞)のネットワークを数理モデル化したものがニューラルネットワークであり、規模こそとても大きくなったものの、今ある深層学習も基本的に全てニューラルネットワークである。
ニューラルネットワークで記述できるのは確率モデルであり、人間がするような論理的な思考を記述することはできないだろう。そうである以上、まだ見ぬブレイクスルーを1つ以上経なければ、真の汎用人工知能を実現することはできないだろう。そう思っていた。
実際、神経細胞網はあくまで脳の一部でしかなく、脳の他の部分をエミュレートした何かが人工知能を実現するのに重要な要素になる、と考えてしまうのはむしろ自然だったわけだ。

そして 2022年末、ChatGPT が登場した。
自然言語処理の数あるタスクの中でも最高難度である対話を、多くの人を感心させるレベルでこなすだけでもすごいのに、同じモデルで文書分類、質問応答、翻訳、言い換え、文生成、要約なども全部まるごと、1つのモデルで実現していることに言葉を失う。

どれほど難しいと言われていたタスクでも、一度でも解けることを誰かに示されれば、次からは他の人も同じレベル以上でそのタスクを解き始めるものである(場合によっては他の方法を使って)。つい最近も、テキストからの画像生成でそれを見たばかりだ。
つまり ChatGPT レベルの AI が今後続々と登場することが予想できる。今は汎用の ChatGPT(とその眷属)しかないが、いろんな特徴を持った AI や、専門分野に特化した AI が登場するわけだ。今は遅かったり不安定だったりする AI のレスポンスも、きっと日常使いに耐えるレベルに向上するだろう。

これはもうシンギュラリティ来ちゃったって言ってもいいんじゃない? いや待て落ち着こう。現時点でシンギュラリティ来てる来てない議論をしても、どちらも決定的な決め手はなく不毛な展開しか見えないので、ひとまず置いておく。

nowokay.hatenablog.com

ChatGPTのヤバいところは、論理処理が必要だと思っていたことが、じつは多数のデータを学習させた確率処理で解決可能だと示したことだと思います。

これは本当にそのとおり。「脳の他の部分をエミュレートした何か」なんかいらんかったんや……というところから、もう一歩考えを進めてみる。

  • そもそも人間の「知能」と呼ばれているナニカは、脳で実現されていることはわかっているものの、どうやって実現しているかはわかっていない。
  • 脳の一部を模したニューラルネットワークという確率的なモデルで、かなり高い精度の「知能」のエミュレーションが可能であることが示された。

ここから素直に考えれば、今まで人間の脳が行ってきたとされる論理処理も、実は「論理的に行われているように見えていただけの確率処理」だったりしないだろうか。実際、「人間の論理処理」は穴があったり飛躍があったりとしばしば間違っており、確率処理だったとしてもなんの不思議もない。むしろ納得感さえある。

Large Language Model は世界の知識を獲得できることが示され共通認識となりつつあるが、同様に「知能のエミュレーション」も獲得できることが ChatGPT によって示された。そしてサールの中国語の部屋は、知能と「知能のエミュレーション」を区別できないことを表している(サールの言いたかったことは逆だが*2 )。

ja.wikipedia.org

このように、「知能は高度な確率モデルである」という仮説は俄然信憑性を増しつつあると思うのだが、哲学はこの問いにどう答えるんだろう。
今までに哲学を浅く狭く読んだ範囲だと、「知能は高度な確率モデル」仮説は今までの哲学を土台から揺らしてくるように思えるのだが、今のところ目立った反応は見えない。スルーなのか、気づいてないのか、単に自分の観測範囲が狭いのか……。
というわけで哲学が ChatGPT 的 AI にちゃんと向き合った言説があればぜひ読みたいので教えて欲しい。緩募。

*1:その頃の自然言語処理界隈では特徴量のことを「素性(そせい)」と言っていた。最近は深層学習でマルチモーダルが当たり前になったからか聞かなくなったなあ。

*2:サールの主張を認めるには「意識」の存在を仮定しないといけないが、それは全然トリビアルじゃないよね? という解釈。