はじめに
開発現場にもAIツールが浸透している昨今、
「そもそもAIとは何か?」
「生成AI(LLM)はどういう仕組みで動いているのか?」
と疑問に思ったことはありませんか?
エンジニアの方のみならず、ChatGPTなどの生成AIを活用している皆さんに、生成AI(LLM)の仕組みを「なんとなく」理解して、「ちょっとだけ」誰かに自慢してほしい!
そして今よりももっとAIを使いこなせるようになってほしい!
この記事は、そんな思いを込めて書いた記事です。
目次
- AIって?: 人工知能、機械学習、深層学習とは?
- にゅーらるねっとわーく?: 深層学習の仕組み
- LLMとは?: 生成AI、ChatGPTの仕組み
- ローカルLLM: 自分の手元でAIを動かすことの意義、凄さ
1. AIって?
AIと一口に言っても、いろいろな単語が思い当たるかもしれません。
例えば、
- 人工知能 (AI): 人間の知能を模倣するシステムの総称(一番広い意味)
- 機械学習: データからルールやパターンを学ぶ手法
- 深層学習 (Deep Learning): 機械学習の一種。人間の脳の仕組み(ニューラルネットワーク)を模倣して、より複雑なパターンを学習する手法
- LLM(大規模言語モデル): 深層学習の技術を用いた生成AI。人間のような自然な言語を生成・理解する能力を持つ
これらはすべて関連していますが、意味が少しずつ異なります。
ざっくり理解
「人工知能」という概念の中に「機械学習」があり、その中に「深層学習」があり、さらにその応用として「LLM」があるイメージです。
AI関連でいろいろな用語があって、それぞれに使い分けがありそう。と、まずは覚えてください!
今回の題目でもあるLLM(大規模言語モデル)は、深層学習の技術を用いて構築されていますが、少し特殊な仕組みを持っているので、後ほど詳しく確認します。
2. にゅーらるねっとわーく?
深層学習のキモとなるのが「ニューラルネットワーク」です。
その前に...
「機械学習」について理解を深めていきます。
2-1 機械学習とは
従来の「機械学習」は、特定のルールに従ってデータをパターン分けしていました。
例えば、下記の「あるなしクイズ」を考えてみます。
| ある | なし |
|---|---|
| 犬 | 机 |
| 猫 | 椅子 |
| 鳥 | 本 |
この場合、「動物であるかどうか」という「区分のルール」さえ、学んでしまえば簡単に区分けできるはずです。このように特徴が明確なら、「区分のルール」を人間が与えてあげれば分類できる。これが「機械学習」です。
2-2 深層学習とは - 機械学習と何が違うのか
しかし、世の中には言葉でルール化しにくいものがたくさんあります。例えば「手書きの数字」です。「深層学習」はより複雑な分類を得意とします。
例えば、手書き数字の分類を考えてみます。
手書き数字「3」
言わずもがな、これは数字の「3」だと認識できるはずです。
ただこれを先ほど機械学習の例で示した「動物であるかどうか」のように単純なルールで区分けすることはできるのでしょうか。
- 白い背景に黒い線で書かれている
- 上下の丸の大きさが似ている
- 始点と終点の位置が縦に並んでいる
- 左側が閉じていない
- 中央部分に配置されている
これでなんとなくは分類できそうですが、これはどうでしょうか。
ずらした手書き数字「3」
たしかにこれも「3」だとわかりますが、上記のルールから逸脱していないか確認してみます。
- 白い背景に黒い線で書かれている → 〇
- 上下の丸の大きさが似ている → △
- 始点と終点の位置が縦に並んでいる → ✕
- 左側が閉じていない → 〇
- 中央部分に配置されている → △(左に寄っている)
自信をもってすべて「◯」にできませんよね?
このような「傾いた3」や「丸が潰れた3」を判断するために、いちいち「こういう線のときは3」とルールを教え込むのは限界があり、ルールを事前に定義しておくことが難しいのです。
そこで深層学習です。
深層学習は、大量の「3の画像」を読み込み、「どこに注目すれば3に見えるか」という特徴自体を、AI自身に学習させます。
補足: 画像も結局数字で表現している(クリックして展開)
画像データも突き詰めれば、色の濃淡で表現された数値データの集合体です。
手書きの「3」を単純化すると、以下のようなデータになります。
0, 0, 0, 0, 0, 0, 0
0, 0, 1, 1, 1, 0, 0
0, 0, 0, 0, 1, 0, 0
0, 0, 1, 1, 1, 0, 0
0, 0, 0, 0, 1, 0, 0
0, 0, 1, 1, 1, 0, 0
0, 0, 0, 0, 0, 0, 0
(※実際にはもっと細かい画素数で、0〜255の階調などで表現されます)
深層学習では、この「数字の並びパターン」と「正解ラベル(これは3です)」をセットにして大量に読み込ませます。
深層学習では明確に定義しにくいルールを、大量の答え付きデータから自動的に学習します。
重要なのは「答え付き」かつ「大量」のデータであることです。つまり、分類先があらかじめ選択肢として定まっているのです。
(これが生成AIとの大きな違いです)
2-3 深層学習の仕組み - ニューラルネットワークとは
ここからは深層学習の仕組みを見ていきます。
なぜ学習用のデータを用意すると分類できるようになるのか。
ニューラルネットワークは、入力された情報に対して「重み付け(重要度の判断)」を行いながら答えを導き出します。
イメージしやすい例として、「アキネーター」というサービスがあります。質問を繰り返して、「あなたが思い浮かべた人物を、質問を通して当ててくれるゲーム」です。
例えばあなたが「ドラえもん」を思い浮かべているとします。
| 質問 | 回答 |
|---|---|
| 男性? | わからない |
| しっぽがある? | はい |
| ポケモン? | いいえ |
| ヒトの言葉を話しますか? | はい |
| Youtube関係者? | いいえ |
| 猫? | たぶん(部分的に) |
| 映画に一度でも出演した? | はい |
| 青い? | はい |
| 五人グループの一人である? | いいえ |
| ドラえもんのキャラクターですか? | はい |
→ アキネーター: 「想像しているのは ドラえもん ですね。」
数多くある選択肢の中から、質問を重ねていくことで、最終的に「ドラえもん」を特定できました。このように質問を積み重ねて選択肢を狭めていく仕組みは、ニューラルネットワークの動作原理に似ています。
この判断プロセスを何度も繰り返して「正解する感覚(パラメータ)」を調整して「学習」し、モデルを完成させていきます。
さらに詳しく原理を理解したい方へ(クリックして展開)
この例とニューラルネットワークの違いを対応させてみます。
- 質問 → ニューロン(各条件)
- 回答 → ニューロンの出力(YES/NO)
- ニューラルネットワーク全体 → 質問の積み重ねによる最終的な分類
ただし実際には、人間のように「質問を順番に」ではなく、
一度に大量の計算が並列に走って答えを決めていたり、回答が「はい」「いいえ」だけでなく、0から1までの連続値で表現されていたり、質問も人間の肌感覚では捉えきれないような要素も含まれ、複雑に構成されています。
ニューラルネットワークは複数の層(レイヤー)で構成されており、各層が前の層からの入力を受け取り、計算を行い、次の層に出力を送ります。
この層が多層であることから「深層」学習と呼ばれています。
深層学習は機械学習と異なり、区分けルールを与える必要がありません。
必要なのは大量のデータで、それが正解データなのか、不正解データなのかを与えることで、ニューラルネットワークが自動的に特徴を抽出し、分類を行います。
画像データも結局は数値データの集合体です(詳細は前述の補足を参照)。
手書き数字の分類の場合、数万枚の手書き数字画像とそれに対応する正解ラベル(これは3です)をニューラルネットワークに与えます。
ニューラルネットワーク内のパラメータ(重み)を何度も更新して最適化していきます。これを学習(訓練)と呼びます。
学習過程を示すグラフの例を示します。
学習過程のグラフ例(イメージ図)
詳しい説明は省きますが、
このグラフは、横軸が学習回数・データ量、縦軸が正解率(1.0が正解率100%)を表しています。
一般に学習回数が増えるにつれて正解率も向上していきます。
近年のAI技術の発展は、大量のデータを収集・処理できるようになったことが大きな要因です。
ここまでのポイント
- 機械学習はルールを与えて分類する
- 深層学習は求める出力結果になるように、大量のデータからパラメータ(重み)を調整していく
3. LLMとは? - 生成AIとは
さて、ここからは生成AIの核心に迫ります。
ChatGPTなどの「生成AI」に使われている LLM(大規模言語モデル: Large Language Model) は、これまでのAIと何が違うのでしょうか?
LLMは、大量のテキストデータを学習し、人間のように自然な言語を生成・理解する能力を持っています。
LLMの代表例として、OpenAIのChatGPTやGoogleのGemini、MicrosoftのCopilot、MetaのLLaMAなどがあります。
生成とは「新しいものを作り出すこと」を指します。
つまり、生成AIは新しいテキスト、画像、音声などを生成する能力を持っています。
もう少し分解してみます。
先ほどまで紹介した深層学習は、膨大な学習データのもと、正解ラベルに合うように学習して、与えられたデータを「学習データで事前に用意していた選択肢」に分類していました。
一方、生成AIは与えられたデータからパターンや特徴を学習し、「未知の問題」であっても新しいデータを生成します。
例えば、ChatGPTに「今日の献立を考えて」と指示すると、回鍋肉のレシピを教えてくれました。また、ChatGPTに「ベランダの掃除の仕方を教えて」と指示すると、ベランダ掃除の流れを手順建てて教えてくれます。
このように、生成AIは「献立」を考えることもできるし、「掃除の仕方」を考えることもできるのです。
一つのことに特化しているわけではなく、幅広いタスクに対応できるのが特徴です。
3-1 LLMの仕組み - アテンション機構
LLMが賢くなった最大の理由が、2017年に登場したTransformerという技術と、その中のアテンション機構(Attention Mechanism)です。
これは、文章の中で「どの単語に注目(Attention)すべきか」を判断する仕組みです。
「今日は天気が晴れるので気分がいいです。」
人間はこの文章を読むとき、「天気」「晴れる」「気分」の関係性を瞬時に理解します。「晴れる」から「気分がいい」のだな、と。
アテンション機構は、文中の離れた単語同士の「関連度」を計算します。
無意識に「晴れる」という言葉を注視していませんか?
このように文章全体を均等に扱うのではなく、「晴れる」という単語に注目することで、文全体の意味をより正確に理解できます。
- 晴れる → なにが: 「天気」に関係しそう
- 晴れる → どうする: 「晴れる」から何をしたいのか、次の文脈で「何らかの行動」を示す文章が続きそう
- 晴れる → いつ: 「晴れる」ことがいつ起こるのか、時間に関する情報が続きそう
このように何かひとつ(Query)に注目して、複数の視点で関連性(Key)を考える(Value)ことで、文脈をより深く理解&予測できるようになります。
LLMにおける学習とは、QueryとKeyの関連性を数値化して重み付けし、Valueに反映させることで、重要な情報を強調し、不要な情報を抑制することを指します。
この仕組みをさらに詳しく学びたい方は、「Attention is All You Need」(2017年に発表されたGoogleの論文)を参照したり、追加調査をしてみてください。
3-2 トークナイザー(Tokenizers)
LLMはテキストデータを扱いますが、そのままの形では処理できません。
そこで、テキストを「トークン(Token)」と呼ばれる小さな単位に分割します。
この処理を行うのが「トークナイザー(Tokenizer)」です。
トークンは単語、サブワード、文字など、さまざまな粒度で分割されます。
LLMでは、トークンを数値ベクトルに変換(Embedding)し、モデルが理解できる形式にします。
- テキスト入力:
「今日は天気が晴れるので気分がいいです。」 - トークン化: テキストをトークンに分割
今日 / は / 天気 / が / 晴れる / ので / 気分 / が / いい / です / 。 - エンコーディング: 各トークンを数値に変換
[2, 3246, 9, 11385, 14, 16577, 28449, 5, 12, 15100, 14, 2575, 2992, 8, 3]
ちなみに、この文章を分割する「トークン化」ですが、実は単純に単語で区切っているわけではありません。ここには賢いアルゴリズムが使われています。
【深掘り】どうやって区切ってる? - BPEアルゴリズム(クリックして展開)
ここから余談ですが、このトークンに分割する作業、どのように行われているか気になりませんか?
代表的な手法として、「BPE(Byte Pair Encoding)」や「WordPiece」などがあります。
そもそも日本語の文章は、英語のように単語間にスペースがないため、単語境界が曖昧で分割しにくい特徴があります。
形態素解析ツールを使って単語に分割する方法もありますが、LLMではサブワード単位で分割する手法が一般的です。
これにより、未知の単語や新語にも対応しやすくなります。
「BPE」などの手法では、「頻繁に隣り合う文字」をくっつけて一つのセット(トークン)にするという方法をとります。
例えば学習コーパスとして以下のような文章があったとします。
今日は晴れ
今日は雨です
明日も晴れ
今日は気分がいい
最初は一文字ずつバラバラに考えます。すると、語彙(初期辞書)は:
今, 日, は, 晴, れ, 雨, で, す, 明, も, 気, 分, が, い
となります。次に"隣り合うペア"の出現回数を数えます。
すると、「今」と「日」の隣り合う回数が多いことに気づきます。
そこで、この2つをくっつけて今日という新しいトークンを作ります。
これを繰り返すと、
- よく使う言葉(今日、晴れ)は1つのトークンとしてまとまる
- あまり使わない言葉は文字単位で分割される
という状態になります。これにより、辞書のサイズを節約しつつ、未知の言葉(新語など)が来ても文字単位で組み合わせて対応できるようになるのです。
上記の例では、各トークンは以下のように数値に対応しています。
-
今日:3246 -
は:9
この対応関係を「語彙(ボキャブラリー)」と呼び、モデルごとに異なります。
上記は公開モデル(tohoku-nlp/bert-base-japanese-v3)での例ですが、別のモデル(例:rinna/japanese-gpt2-small)では異なる数値が割り当てられます。
-
今日:4761 -
は:11
各モデルは独自の意味空間を持っており、トークンはその空間上の座標として表現されています。
その言葉の座標(ベクトル)には、面白い性質があります。
「王様」 - 「男」 + 「女」 = 「女王」
「王様」という座標から「男」成分を引き、「女」成分を足すと、不思議と「女王」の座標にたどり着きます。
つまり、AIの内部では、言葉の意味が計算可能な数値として存在しているのです。
【深掘り】ベクトル空間を覗いてみる(クリックして展開)
ここからはイメージで理解してほしいので、実際とは異なるかもしれませんが、そのマッピングを考えてみます。
例えば、時間軸で考えると、
-
今日:[0, 0, 0] -
明日:[1, 0, 0] -
昨日:[-1, 0, 0] -
今年:[2, 0, 0] -
来年:[9, 0, 0] -
一昨年:[-10, 0, 0]
大きさは違いますが、未来志向になるほど、X軸が正の方向にベクトルが伸びています。
他にも主語で考えると
-
私:[6, 5, 1] -
俺:[4, 3, -1] -
僕:[5, 4, 0] -
あたし:[5, 8, 2]
第一象限に固まってそう?
文章中の同じような意味合いで使われる単語群は、ベクトル空間の似た場所にマッピングされます。
このように、ある種の法則性に基づいて、各トークンは意味をもって配置されるのです。
下記のサイトでは、 実際のマッピングされたベクトル空間を可視化して確認できます。
Embedding projector - visualization of high-dimensional data
検索欄に"today"を入力した例が下記の画像です。
空間的に近い単語("now", "current"など)が右側にリストで表示されています。
Embedding Projectorで可視化した単語埋め込みの例("today"に近い単語群の表示)
AIは確率的に次の単語を予測していると言われますが、まさにこの空間上で「意味的に近い(次にきそうな)場所」を探しているイメージです。
ChatGPTがスラスラ喋っているのは、意思があるわけではなく、 「文脈的に次にくる確率が最も高い言葉を、言葉の空間から選んでいるだけ」 です。
それが人間に近いレベルまで高精度になったのが現在のLLMです。
3-3 LLMの学習 - ファインチューニング、LoRA
LLMの学習は主に以下の2つのステップで行われます。
-
事前学習 (Pre-training):
広辞苑やインターネット全体を読み込むようなもの。言葉の文法、一般的な知識、文脈のパターンを徹底的に学び、「ベースとなるモデル」を構築します。膨大な計算資源と時間が必要で、通常は企業や研究機関が実施します。 -
ファインチューニング (Fine-tuning):
事前学習モデルを特定のタスク向けに再教育すること(例:医療用語、特定の口調)。比較的小規模なデータセットと計算資源で実行可能で、個人のPC(ゲーミングPC程度のスペック)でも実施できます。LoRAなどの技術は、この追加学習を「教科書全部書き換え」ではなく「付箋を貼る」くらい手軽に行うための工夫です。
こうした背景から、事前学習済みのLLMモデルがオープンソースで公開されています。
Hugging Faceは、多数の事前学習済みモデルが提供されているプラットフォームです。先ほどのトークナイザーの例で紹介したモデルも、Hugging Faceからダウンロードしてローカルで動かしたものです。
ファインチューニングでは、どのパラメータを更新するか(全部?後半だけ?最後の層だけ?)、元のパラメータはそのまま、追加の層を加えてカスタマイズするなど、さまざまな手法があります。
4. ローカルLLM
ここまでで、LLMの基礎技術や学習方法について見てきました。
では、実際にLLMをどのように活用していくのか、その使い方について見ていきましょう。
そして、ここからが本記事の本題である 「ローカルLLM」 です。
4-1 ChatGPTとはなんなのか?(クラウド型LLM)
実は、ChatGPTに使われている技術(GPT-3.5のベース)自体は、ChatGPTが公開される前から存在していました。
しかし、当時は一般のニュースになることはほとんどありませんでした。
それは、使い方が難しかったからです(CUIベース)。
あくまで「研究者やエンジニアが使う専門ツール」だったのです。
普及したきっかけが、ChatGPTの登場です。
LINEのような「チャット形式」にしたことで、コマンドなど知らなくとも直感的にAIと会話できるようになったのです。
4-2. なぜオンライン(クラウド)必須なのか? - 「推論」のコスト
そんな便利なChatGPT、なぜインターネット経由で使う必要があったのでしょうか。
それは、高性能なAIを動かすには膨大な計算リソースが必要だからです。
AIのコストというと「学習(モデルを作ること)」ばかり注目されがちですが、実は「推論(完成したモデルを使うこと)」にも莫大なコストがかかります。
ChatGPTのような巨大なモデル(パラメータ数が兆単位)は、質問に一回答えるだけで業務用GPU(数百万円)を何枚もフル稼働させています。個人のPCやスマホでは処理が不可能でした。
世界中の人が同時に質問する状況を支えるには、巨大なデータセンターで一括処理するしか選択肢がなかったのです。
私たちが無料または月額数千円でChatGPTを使えるのは、OpenAI社がこの推論コストを負担しているからです。
4-3. なぜ今「ローカル」なのか? - モデルの小型化と普及
しかし、ここ最近で流れが変わってきました。
世界中の研究者が「性能はそこそこでいいから、一般人のPCでも動くサイズ(推論コストが低い)のモデル」を開発し始めたのです。
これがローカルLLMです。
つまりLLMの処理場所は、大きく2つに分けられます。
-
サーバーサイド(クラウド):
AWSやAzureなどの巨大なサーバーで処理
重い処理が可能だが、通信ラグがある
ChatGPTはここに該当 -
エッジサイド:
ユーザーの端末(PC、スマホ、IoT機器)で処理
リソースは限られるが、反応が速くプライバシーに強い
ローカルLLMはここに該当
これからの時代は、重たい相談はクラウドへ、ちょっとした要約や翻訳はエッジ(ローカル)へ、というハイブリッドな使い分けが進んでいきます(実際にすでに始まっています)。
そこで、自分のPCで動かすメリットを整理します。
-
セキュリティとプライバシー
クラウド型AIの場合、入力したデータは学習に使われる可能性があるため、
「社外秘のコード」や「個人情報」をChatGPTに入力するのはリスクがあります
しかし、ローカルLLMならオフラインですべて完結するため、データが外部に漏れません -
オフラインで動作
ネット環境がない飛行機の中でも、山奥でも対話できます -
カスタマイズ
あらかじめ用意されたモデルをそのまま使うのではなく、自分の用途に合わせてファインチューニングや追加学習が可能です
特定の専門分野に特化したモデルを作成できます
4-4. どのようにローカルでモデルを扱うか? - OSSとHugging Face
では、ローカルで動くモデルをどのようにして手に入れるのか。
ここで登場するのが OSS(オープンソースソフトウェア) の文化です。
2023年、Meta社が「LLaMA」という高性能なモデルを公開したことを皮切りに、世界中で「オープンなモデル」の開発競争が始まりました。Googleの「Gemma」、Microsoftの「Phi」、日本企業(サイバーエージェントやRinnaなど)も日本語に強いモデルを公開しています。
これらのモデルが集まる場所が前述の Hugging Face です。
「AI版のGitHub」として、世界中の開発者が作ったモデルが公開されています。
(※使用時は規約を確認してください)
【深掘り】モデルの軽量化技術(量子化)
量子化(Quantization) とは、モデル内部で使用される重み(パラメータ)や中間表現(アクティベーション)を、より低いビット精度で表現することで、モデルサイズや計算負荷を削減する技術です。これにより、元の精度をできるだけ保ちつつ、ローカル環境での高速推論が可能になります。
通常、ニューラルネットワークの重みは 32bit の浮動小数点数(FP32) で表現されています。
量子化では、これらを 8bit(INT8)や 4bit(INT4)などの整数 で表現します。
実際は単純に四捨五入するわけではなく、32bitの浮動小数点(float)のパラメータ空間をそのままに、8bitの整数(int)にマッピングされています。
そのため、このおかげで、元の値の情報を最大限保ちながら、メモリ使用量と演算量を大きく削減できます。
もともとLLMでは、FP32 や FP16 を扱うため、
浮動小数点演算を高速に処理できる GPU が必須でした。
量子化によりLLMモデルの推論が整数(int)での計算が可能になったため、一般的なCPUでも高速に動作させることができるようになりました。
また、量子化モデルの普及とともに、整数演算に最適化された専用チップ(TPUやNPUなど)も登場しています。
これらは INT8 や INT4 の行列演算に最適化されており、ローカルLLMの高速化・省電力化に大きく貢献しています。
4-5. スマホで動くLLM
現在、ローカルLLMはスマートフォンでも動くようになってきています。
最新のスマートフォンには、AI処理専用のチップNPU(Neural Processing Unit)が搭載されています。Googleの「Gemini Nano」やAppleの「Apple Intelligence」は、スマホ内(オンデバイス)で動作するLLMです。
「文章を要約する」「通話をリアルタイムで翻訳する」といった機能が、通信なしでデバイス上で完結するようになってきています。
こうしたオンデバイスAIを実装したデモアプリもオープンンソースで公開されています。
さいごに
ここまで、AIについて「なんとなく」理解できるよう広く解説してきました。
便利に生成AIを使うために、今一度その歴史や原理を知ることで、さらに活用の幅が広がることを願っています。
この記事をきっかけに、皆さんがLLMの仕組みを「ちょっとだけ」理解し、周りの人に自慢したり、実際にローカルLLMを含め触ってみたりするなど、「何かを始めるきっかけ」になれば幸いです。
その仕組みを理解して、より良い使い方を模索していきましょう!
