見出し画像

初心者向けLLM学習:名前生成の裏側①

この記事の対象者

  • PythonやGitをちょっとやったことある

  • LLM(大規模言語モデル)について興味がある

  • プログラミング初心者


はじめに

こんにちは、みんな!今日はLLM(大規模言語モデル)というものと、それを使ってどうやって名前を作るかについてだよ。でも心配しないで、初心者でも楽しめるようにわかりやすく説明するね!


みんなは「LLM」って聞いたことあるかな?これは、コンピュータが人間の言葉を理解して、新しい言葉を作ったり、話したりできるようになる魔法みたいなものなんだ。そして今日の主役、「namegen」というプロジェクトは、この魔法を使って新しい名前を作り出すんだよ。


このプロジェクトは、LLMの基本的な概念を理解するための入門として最適だよ。

名前生成プロジェクト「namegen」の紹介

次は、「namegen」というとっても面白いプロジェクトについて話してみよう。このプロジェクトは、Leszek Mielnikowさんが作成した教育目的で簡単な言語モデルなんだ。これを使うことでコンピュータが新しい名前を作り出すお手伝いをするんだ。想像してみてね。お友達に新しいニックネームをつけるようなものだけど、そのアイデアを出すのがコンピュータなんだよ。



このプロジェクトは、とってもシンプルで、コンピュータが言葉を学ぶ最初のステップとしてぴったりなんだ。でも、そのシンプルさがいいんだ。なぜなら、これからLLMの世界を学ぼうとする人たちにとって、とても理解しやすいからね。

「namegen」を使えば、誰でも簡単に自分だけの特別な名前を作り出すことができるようになるんだ。だから、このプロジェクトは、コンピュータと一緒に遊びながら学べる、とっても素敵な友達みたいなものなんだよ。


このプログラムには、主に2つの魔法があるよ。

  1. train("dataset_name.txt"):

    • この魔法は、「names.txt」という名前のファイルから名前のリストを読み込むんだ。

    • 読み込んだ名前を一つずつ見ていって、どの文字がどれだけ使われているかを調べる。

    • それを使って、名前を作るルールを学習するんだ。これは、PyTorchという特別な魔法の道具を使って、文字をどう組み合わせるかを学ぶって感じ。

    • 学んだルールはself.fourgramsっていう場所に保存されるよ。

  2. generate_names(num_names=1):

    • この魔法は、学んだルールを使って新しい名前を作り出すんだ。

    • 「num_names=1」っていうのは、デフォルトで1つの名前を作るってこと。もっとたくさんの名前が欲しい時は、数字を変えればOK。

    • 学んだルールに従って、文字を一つずつ選んで名前を作っていく。その時、ind_to_charっていう魔法を使って、数字から文字に戻すんだよ。

つまり、最初に学習の魔法で名前を作るルールを学び、その後はそのルールを使って新しい名前を次々に作り出すんだ。


ちなみに、names.txtをメモ帳などで開くと以下のように名前のデータが記載されている。

emma
olivia
ava
isabella
sophia
charlotte
mia
amelia
harper
evelyn
abigail
emily
elizabeth
mila
ella
avery
sofia
・
・
・


さぁ、やるぞ。



namegenの使い方


使い方は簡単です。
Windowsの場合、コマンドプロンプトまたはPowerShellを起動して以下のコマンドを実行すると新しい名前を出力してくれます。gitやPythonを導入していない場合は次の説明でインストールしておきます。

git clone https://github.com/LexiestLeszek/namegen.git
cd namegen
pip install torch
python namegen.py  


Windowsにgitをインストールしていない場合は、インストールします。
以下の記事が参考になります。


Pythonをインストールしていない場合は、Pythonもインストールします。


仮想環境(venv)を構築する場合


git clone https://github.com/LexiestLeszek/namegen.git
cd namegen
python -m venv venv
.\venv\Scripts\activate.bat
pip install torch
python namegen.py 

仮想環境についての説明


実行結果

python namegen.pyを実行すると、以下のようなものが出力される。

Vocab Tokens:
 ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
Vocab Length: 27
Character-to-Index mapping:
 {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10, 'k': 11, 'l': 12, 'm': 13, 'n': 14, 'o': 15, 'p': 16, 'q': 17, 'r': 18, 's': 19, 't': 20, 'u': 21, 'v': 22, 'w': 23, 'x': 24, 'y': 25, 'z': 26, '.': 0}      
Trarining starts ...
Training finished!
Beowulf
Saianissey
Adiyonaire
Journesynn
Jakobe
Dily
Calis
Ela
Mabel
Sha

実行結果の下の方に英語の名前がいくつか生成されていますね。


どうやって名前を生成しているの?

先ほど実行したコマンドで、namegenというフォルダが作成されています。その中にあるnamegen.pyをメモ帳やVSCodeで開きます。


namegen.pyの概要

namegen.pyは100行未満のコードで構成されています。

  1. クラスの定義: NameGenというクラスを作っていて、これが名前を生成するための設定や機能を持っているよ。

  2. 初期化 (__init__メソッド): クラスが最初にどんなデータを持っているかを設定している。文字や文字と番号の対応表(辞書)などがこれに当たるね。

  3. トレーニング (trainメソッド): この部分は、名前を生成するために必要な情報を学習するためのもの。ファイルから名前を読み込んで、どんな文字がどのくらいの頻度で使われるかを記録しているよ。

  4. 名前の生成 (generate_namesメソッド): 学習した情報をもとに、新しい名前をランダムに生成する部分。ルールに基づいて、一文字ずつ名前を組み立てていくよ。


今回は、1.クラスの定義と2.初期化 (__init__メソッド)を解説しますね。


1.クラスの定義

torch という道具を使えるようにし、NameGenという名前のクラスを定義しています。torchは、機械学習やディープラーニングでよく使われるPythonライブラリ(道具みたいなもの)です。
ほら、さっき「pip install torch」ってコマンドありましたよね?

import torch

class NameGen:


2.初期化 (__init__メソッド)

名前を作るマシン(インスタンス)が作成された時に自動的に呼び出され、クラス内で使用される色やサイズみたいな特徴(属性)を初期化する。

# NameGenクラスの初期化関数(__init__)を定義
def __init__(self):
        self.characters = None
        self.char_to_ind = None
        self.ind_to_char = None
        self.fourgrams = None
        

初期化しないと名前を作るルールを学んだりするための「空の箱」が用意されていない状態みたいな感じ。これは、絵を描き始める前に、ペンや紙が全くない状態と似ているよ。

絵描けへんがな!


今回はここまで。


次回は、3.トレーニング (trainメソッド)について詳細に解説します。


おまけ

このコードは、名前のデータセットのマルコフ連鎖に基づいてモデルをトレーニングし、名前に似た新しい文字シーケンスを生成しています。

マルコフ連鎖とは、ある状態が次の状態にどのように遷移するかを確率的に表す数学的なモデルです。簡単に言えば、過去の状態に基づいて未来の状態を予測するモデルです。

例えば、「さくらちゃんが今、ジュースを飲んでいたら、次にお菓子を食べるかもしれない」とか。でも、さくらちゃんがジュースを飲んでいる前に何をしていたかは関係なくて、今ジュースを飲んでいることだけが次に何をするかを予想する手がかりになるの。

つまり、マルコフ連鎖は、「今何が起こっているか」だけを見て、「次に何が起こるか」を予想する方法なんだよ。


予想するマルコフさん


この記事が気に入ったらサポートをしてみませんか?