52
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

1. はじめに

本記事では、昨今話題になっている大規模言語モデルの基礎的な内容として、モデルの内部構造や学習の手続き、その応用について紹介します。

2. 大規模言語モデルとは

大規模言語モデル(LLM: Large Language Model)は、機械学習の枠組みで日本語や英語などの言語を数理的に取り扱う生成モデルの一種です。言語を統計的に取り扱う言語モデルの登場は1990年にまで遡り、その後2000年代のニューラル言語モデルや、2017年のTransformerに端を発する学習済言語モデルの登場など、数多くの発展を遂げてきました。この流れの中で、2022年にOpenAIから発表されたChatGPT(GPT-3.5)は、あたかも人間と会話しているかのような流暢な言語の生成ができることで話題になりました。その後、GPT-4(OpenAI)、PaLM2(Google)、LLaMA2(Meta)など、2023年だけで数多くのLLMが発表されています。
 
この記事では、多くのLLMが採用しているTransformerの構造から、学習によってLLMが言語を理解する能力を獲得する過程、実際のLLMの活用について紹介します。

2-1. LLMの内部構造

LLMの内部は、画像認識等にも用いられる深層ニューラルネットワークと呼ばれる機械学習モデルの一種です。

特に、最も単純な深層ニューラルネットワークは多層パーセプトロンと呼ばれます。多層パーセプトロンは、様々なデータの分析に用いられる機械学習アルゴリズムで、任意の次元の数値ベクトルに対して、変換を繰り返すことで目的の数値ベクトルを獲得します。図1に、入力層 $(x_1,x_2,\dots,x_{N_{\mathrm{in}}})$、隠れ層 $z_i^l (l=1,2)$、出力層 $(y_1,y_2,\dots,y_{N_{\mathrm{out}}})$ から成る多層パーセプトロンを示しました。多層パーセプトロンを構成する層は全結合層と呼ばれ、前の層の全ての要素が行列 $W^l=(w_{ij}^l)$ によって結合されます。さらに、活性化関数と呼ばれる非線形関数 $f(\cdot)$(ReLU、sigmoid関数など)を作用させることで、柔軟な表現力を有します。

多層パーセプトロンを用いれば、様々な問題を解くことができます。例えば、犬または猫の画像から、どちらの画像であるかを識別する問題を多層パーセプトロンで解く場合には、入力の数値ベクトル $(x_1,x_2,\dots,x_{N_{\mathrm{in}}})$ は画像の各ピクセルのRGBの値を表し、出力されるベクトル $(y_1,y_2)$ はそれぞれその画像が犬/猫である確率を表します($N_{\mathrm{out}}=2$)。各層間の変換に用いられる行列 $W^l=(w_{ij}^l)$ は、実際の画像と正解(犬または猫のラベル)の対から学習することで最適なものが決定されます。

多層パーセプトロン.jpg
          図1: 多層パーセプトロン

ほとんどの大規模言語モデル(LLM)は、深層ニューラルネットワークの中でも、特に2017年に提案されたTransformer(文献[7])と呼ばれるアーキテクチャを採用しています。Transformerは、Attention機構の導入によって、言語を効率的に取り扱うことができるように設計された発展的な深層ニューラルネットワークです。

Transformerを用いた言語モデルは、さらにその構造によってDecoder only(Causal Decoder)、Encoder-Decoder、Encoder onlyなどに分けられます。図2は、2018年以降に発表された言語モデルの進化の様子を表した系統樹です。この系統樹では、3つの大きな枝がそれぞれの構造のモデルを表しており、青色の枝がDecoder only(Causal Decoder)、緑色の枝がEncoder-Decoder、ピンク色の枝がEncoder onlyの言語モデルを表しています。この図を見ても分かるように、近年の言語モデルのほとんどはCausal Decoderです。以降ではCausal Decoderを前提として、Transformerを構成する要素について説明します。

LLM_evolutionary_tree.jpg
図2: 言語モデルの進化系統樹(J. Yang et al., Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond Fig.1を引用)

(1) トークン埋め込みと位置埋め込み
文章を理解するためには、それを構成するトークン(≒単語)の種類・位置関係が重要になります。トークンの種類・位置関係を数値に変換したものがそれぞれトークン埋め込み(token embedding)・位置埋め込み(positional embedding)です。どちらも多次元の数値ベクトルで、その次元は言語モデルによって異なります。
トークン埋め込みは、Transformerの登場以前に発表されたWord2VecやGloVeなどで計算される単語ベクトルと類似の概念であり、トークン同士の共起情報を用いて数値化されます。
位置埋め込みは、文章中でのトークンの位置の情報を数値化したもので、語順の違いを数値で表現するためのものです。Transformerの提案論文では、三角関数を用いた変換を事前に与える方法で実装されていました。その後の言語モデルでは、位置埋め込みの数値表現自体をコーパスから学習することも行われています。

(2) Attention機構、Multi-head Attention
Attention機構はTransformerの中核となるネットワーク構造です。文章を理解するには、トークンの種類・位置関係からそれらの依存関係を把握することが必要です。この単語間の依存関係を表現するために使われるのがAttention機構です。
具体的には、トークン埋め込みや位置埋め込みから計算された各トークンの数値表現を線形結合によって混合し、複数トークンの情報を混合した数値表現を獲得します。このときの線形結合の係数によって、トークン間の依存関係の強さを表します。つまり、依存関係の強いトークン間では大きい係数を、弱いトークン間では小さい係数とします。処理する文章に合わせて線形結合係数の大小を適切に調節することが、Attention機構によって実現されます。

実際の文章におけるトークン間の依存関係は多様です。例えば「彼女は公園で本を読んで静かに過ごしています。」という文章の場合、下記のようにトークン間の関係にはさまざまな種類が存在します。

a. 主体と行動の関係性
本を「読んで」いるのは「彼女」ですので、この2つのトークンには主体と行動の関係があります。

b. 目的と手段の関係性
「静かに過ご」すために本を「読んで」いることが読み取れます。したがって、これらのトークン間には目的と手段の関係があります。

c. 空間的な関係性
「公園で」という表現から、この文に書かれている内容とその場所の関係が読み取れます。

d. その他の関係性
もっと長い文章の中にこの文が含まれている場合、これより前の文に、この文に至るまでの状況が記述されているかもしれません。

これらの多様な関係を記述するために、TransformerではMulti-head Attentionが用いられます。そこでは様々な依存関係を表すためのいくつかのAttention機構が並列に存在し、それらを結合することで、文章の複雑な構造を表現する数値表現が獲得されます。

(3) その他の要素(層正規化・活性化関数・全結合層・残差結合)
その他、多層パーセプトロンでも用いられていた活性化関数や全結合層は、Transformerでも使われます。活性化関数はReLUや、ReLUを滑らかにしたGeLUなどが利用されます。その他、層正規化や残差結合などの、一般的な深層ニューラルネットワークで利用される技術もTransformerでは利用されていますが、ここでは詳細は割愛します。

2-2. LLMの訓練

前節では、LLMの内部構造を紹介しました。その中に含まれるAttention層や全結合層では、重みと呼ばれる行列を乗算する変換が施されます。この重みの値が、Transformerが言語を理解する能力を決定します。適切な重みの値を決定する過程が、言語モデルの学習と呼ばれる手続きです。学習の過程は、さらに事前学習とFine-tuningに分けられます。特にLLMの驚異的な能力は事前学習によって獲得されます。ここでは、それぞれの学習の手続きについて紹介します。

2-2-1. LLMの事前学習

先に説明したように、LLMの多くは、Transformerをベースとした深層ニューラルネットワークです。LLMは大量のテキストデータセット(コーパスと呼ばれます)を事前学習することで、言語を理解するための能力を獲得します。言語モデルの事前学習は、与えられた文章から次に出現するトークン(≒単語)を予測するタスク(このタスクのことも「言語モデル(LM)」と呼ばれます。)を解くことによって実現されます。

近年の主要なLLMで採用されているCausal Decoderアーキテクチャは、過去に出現したトークンの情報をAttention機構で取り込んだ上で、次に出現するトークンの予測確率を計算する構造になっています。この条件では、例えば「犬は公園で遊んでいます。」という文章を用いてLLMを学習する場合、まずは1つめの単語の「犬」が与えられた条件で2つめの単語が「は」となる確率が大きくなるようにTransformerの重みパラメータが更新されます。同様に「犬は」が与えられた条件で3つめの単語が「公園」になる確率、「犬は公園」が与えられた条件で4つめの単語が「で」になる確率、...、というぐあいに、各単語が順々に予測できるようにTransformerのパラメータ(全結合層やAttention層の重み)が更新されていきます。これは、クロスエントロピーと呼ばれる損失関数を最小化する問題として定式化され、上の例では各トークンの予測確率から算出される5個のクロスエントロピー

\begin{align}
L_{CE}(t_2) = &-\log p_{は}(t_1=\mathrm{「犬」}) \\
L_{CE}(t_3) = &-\log p_{公園}(t_1=\mathrm{「犬」}, t_2=\mathrm{「は」}) \\
L_{CE}(t_4) = &-\log p_{で}(t_1=\mathrm{「犬」}, t_2=\mathrm{「は」}, t_3=\mathrm{「公園」}) \\
&\cdots \\
L_{CE}(t_6) = &-\log p_{います}(t_1=\mathrm{「犬」}, t_2=\mathrm{「は」}, \cdots, t_5=\mathrm{「遊んで」} ) \\
\end{align}

の平均値によって、この文に対する損失関数が定義されます:

\mathrm{Loss} = \frac{1}{5}\left(L_{CE}(t_2)+L_{CE}(t_3)+\cdots+L_{CE}(t_6) \right)

ここで、例えば $p_{で}(t_1=\mathrm{「犬」}, t_2=\mathrm{「は」}, t_3=\mathrm{「公園」})$ は、$t_1=
\mathrm{「犬」}, t_2=\mathrm{「は」}, t_3=\mathrm{「公園」}$の条件の下で、次のトークン$t_4$が「で」になる確率を表します。Transformerで算出される予測確率から損失関数を計算する様子を図3に示しました。

一般に、トークンの列 $(t_1, t_2, \dots, t_N)$ に対して、$t_i$ の予測確率は1番目から$i-1$番目までのトークンに依存する形で計算でき、そのクロスエントロピーは

L_{CE}(t_i) = - \log p_{t_i} (t_1, t_2, \cdots, t_{i-1})

で、損失関数は

\mathrm{Loss} = \frac{1}{N} \sum_{i=1}^{N}L_{CE}(t_i)

となります。

Transformerの事前学習.jpg
          図3: Transformerの学習

事前学習の過程で、Transformerの重みは自然な文章を作るように更新され、結果として言語を理解する能力が獲得されます。
まず、一つの文に含まれるトークンの依存関係からは、妥当な単語の順序などの文法的知識を獲得することができます。書籍などの長い文章で次のトークンを正しく予測するためには、過去の文脈の理解が必要になるため、複雑な文脈を理解する能力も獲得されます。また、一般常識に関する知識や専門知識も事前学習で獲得されます。例えば、「DNAの二重らせん構造はワトソンとクリックによって発見された」という文章でトークン予測問題に正解するには、DNAの二重らせん構造を発見した人物のことを知らなければなりません。

2-2-2. 事前学習コーパスのサイズとスケーリング則、創発的能力

事前学習で言語モデルの精度がどの程度のものになるかは、事前学習に用いるコーパスのサイズとTransformerモデルのサイズ(層数や埋め込みベクトルの次元)によって決まります。この関係は、スケーリング則と呼ばれます。

スケーリング則の発見後、より高性能の言語モデルを得るために、モデルサイズ・事前学習コーパスの大規模化が進みました。その流れの中で、2020年にOpenAIからGPT-3が発表されました。GPT-3は、直接学習していない未知の問題についても、入力テキストを工夫することで回答することができることが報告されました。この能力は創発的能力(emergent abilities)と呼ばれ、GPT-3以前の言語モデルには見られなかったものです。創発的能力は、モデルサイズと事前学習コーパスのサイズがある閾値を超えたときに獲得されることが発見されました。図4は、(A)~(H)の言語タスクにおいて、事前学習時の計算量(FLOPs: モデルサイズと事前学習コーパスで決まる量)がある値を超えたとき、精度が急激に向上する様子を示しています。創発的能力の有無が、それまでの学習済言語モデルとLLMを分ける基準になっています。

LLMの事前学習では、大量のコーパスが利用されます。例えば、Metaから2023年7月に公開されたLLaMA2は2兆トークンの事前学習コーパスを利用しています。200~300ページの文庫本は大体5万~10万トークンほどに相当するので、これは文庫本1,000万冊以上に相当するテキスト量になります。LLMは、人間が一生で触れられる文章量よりも圧倒的に大きいコーパスに触れることで、驚異的な能力を獲得しています。

その後の研究で、FLOPsだけでなく、事前学習コーパスの品質も、LLMの性能にとって重要なファクターであることが分かってきました。事前学習コーパスは大規模であるがゆえに、人手によるデータ整理はほとんど行われません。したがって、事前学習コーパスの品質は低いことが一般的です。しかし、品質の高いコーパスを用いて事前学習を実施すれば、スケーリング則で予測されるよりも高い性能のLLMが得られます。文献[24]はプログラミングのテキストブックで構成される高品質の事前学習コーパスを用いた場合、特定のタスクに限れば、比較的小さいコーパスサイズ(~10億トークン)でも高い性能のモデルが得られることが報告されています。

emergent_ability.jpg
          図4: 創発的能力の発現(J. Wei et al., 2022のFig.2を引用)

2-2-3. LLMのFine-tuning

LLMの事前学習で使われるコーパスには、書籍やWeb上の記事など、様々な形式の文書が含まれることを述べました。この中には、会話形式のテキストや物語形式のテキスト、あるいはPythonやJavaといったプログラミング言語のソースコードなど、ありとあらゆる文書が含まれます。LLMは、これらの文書を用いた事前学習により、自然な文章を生成する能力を獲得しますが、あらゆる形式の文書が含まれているがゆえに、生成する文章の制御が難しいという問題があります。特に、暴力的・差別的な文章が生成される可能性があることは大きな問題であり、このことがLLMの一般利用を妨げる原因になっていました。

2022年にOpenAIから一般公開されたChatGPTは、事前学習後に特定のタスクで微調整(Fine-tuning)することで、この問題を克服しました。図5は、Fine-tuningの有効性を示しています。具体的には、GPT-3をベースにしてFine-tuningを施したもの: PPO-ptx, PPO, SFTと、事前学習のみでFine-tuningをしていないもの: GPT, GPT(prompted)の5種類のモデルが生成したテキストに対して、人が優劣を判断した結果を示しています。横軸はモデルのサイズ(パラメータ数)、縦軸は1,750億パラメータのSFTモデルが生成したテキストと比べて優れていると判定されたテキストの割合を示しています。人のフィードバックによるFine-tuningを施したPPO, PPO-ptxや、教師あり学習を施したSFTが、これらの調整を施さずに事前学習だけを行っているGPT(prompted)やGPTよりも、人によって好まれる文章を生成する傾向があることを示しています。

以降では、事前学習モデルのFine-tuningの手法として、教師あり学習とRLHFを紹介します。

InstructGPT.jpg
     図5: プロンプトvs.教師あり学習vs.RLHF(L. Ouyang et al., 2022のFig.1を引用)

2-2-4. 教師あり学習によるFine-tuning(Supervised Fine-Tuning)

ここでは、図5のSFTに相当する教師あり学習を紹介します。教師あり学習は、言語モデルに限らず一般的な機械学習モデルの学習に利用される手法です。あらかじめ用意しておいた入力データと正解データの対応関係を学習することで、未知のデータが入力されたときに正しい正解データを算出することができる予測モデルを構築するための手法です。LLMは、与えられたテキストに続くテキストを予測する機械学習モデルなので、教師あり学習では、あるテキストとそれに続くテキストを与えて学習を行います。

学習の種類 学習データセット データセットの大きさ コーパスの品質
事前学習 大量のコーパス(Webページ、書籍など) 数百億~数兆トークン 低い
教師あり学習
(instruction-tuning)
プロンプトと回答の対 数千~数万対 高い

LLMの教師あり学習では、Instruction-Tuningと呼ばれる方法が用いられます。図6は、Instruction-Tuningに用いられるデータセットの1つであるStanford alpacaデータセットの一部を示しています。Instruction-Input-Outputの3つの文章が52,000組含まれていて、InstructionとInputを結合したテキストから、Outputのテキストを生成するように訓練をします。Instruction-Tuningの実行によって、質問と回答の手本を学習し、より望ましい回答を生成するように調整することができます。

alpaca_3例.jpg
図6: Stanford alpacaデータセット(オリジナルのデータセットは英語であり、図は4例を抽出し和訳したもの)

2-2-5. 人のフィードバックを利用したFine-tuning

次に、人のフィードバックを利用したFine-tuningについて紹介します。これは図5のPPO-ptx, PPOに相当し、教師あり学習(SFT)だけのものより望ましい文章の生成を可能とします。この時に利用されるのは強化学習と呼ばれる機械学習アルゴリズムの一種で、RLHF(Reinforcement Learning from Human Feedback)と呼ばれます。先述の教師あり学習ではお手本となる正解データが必要となりますが、強化学習では報酬と呼ばれる間接的な目的関数を参照することでモデルを学習します。

LLMのRLHFによる訓練は、一般的に図7に示したStep1-Step3の流れで実行されます。

Step1: 教師あり学習
教師あり学習によって生成する文章の形式を整える工程です。

Step2: 報酬モデルの訓練
報酬関数を計算するための報酬モデルを訓練します。報酬モデルは強化学習によるLLMの調整の際に、人の代わりにフィードバックを与える予測モデルです。LLMにプロンプトを入力して文章を生成させ、人がそれを好ましい順にランク付けをし、そのランクを予測するように学習して報酬モデルを獲得します。

Step3: 強化学習によるLLMの訓練
報酬モデルによって好ましい文章が生成されるようにLLMを調整します。このStepでは、PPOと呼ばれるアルゴリズムが使われるのが一般的です。

RLHF_flow.jpg
          図7: RLHFの手続き(L. Ouyang et al., 2022のFig.2を引用)

RLHFによるLLMの調整では、人によるフィードバックを与えるために報酬モデルと呼ばれる別の予測モデルが必要となるなど、その手続きが複雑になります。
一方、教師あり学習の枠組みで人のフィードバックによる出力の修正をおこなうDPOなども提案されています(文献[14])。こちらの方法では、より単純なフローでRLHFと同じ目的を達成することができます。

3. LLMの活用

本章では、LLMの具体的な活用方法について説明します。

3-1. プロンプトエンジニアリング

LLMは、入力のテキストを適切に与えることで多様なタスクを解くことができます。LLMに与えるテキストはプロンプトと呼ばれ、この内容によって得られる回答の質は大きく変わります。LLMを効率的に扱うためにどのようなプロンプトを与えるのが適切なのかを研究する分野はプロンプトエンジニアリングと呼ばれ、関連する研究が盛んに行われています。
ここでは、その中でも単純なZero-shotプロンプティングとFew-shotプロンプティングを紹介します。

Zero-shotプロンプティングでは、解きたいタスクを直接LLMにプロンプトとして渡すことで、LLMに回答を作らせます。「創発的能力」のところで紹介したように、LLMは未知の問題にも対応することができるので、簡単な問題であればZero-shotプロンプティングによって解くことができます。

Few-shotプロンプティングは、In-context-learningとも呼ばれるプロンプティングの方法です。問題と回答の例を数例与えることで、未知の問題を解くことができます。Zero-shotプロンプティングよりも複雑な問題を解くことができます。

zero-shot_and_few-shot.jpg
図8: zero/few-shot プロンプティング(入出力はPrompt Engineering Guide(日本語版)の例を引用)

3-2. LLMを用いた情報検索

LLMは、事前学習段階で言語の処理能力に加えて、一般常識などの知識を獲得しています。したがって、LLMは情報検索システムに近い形で利用することが可能です。一方で、LLMを情報検索に利用する場合の課題として、次の2つが挙げられます。

(1) 新しい情報、時事的な情報に対応することができない
LLMは、知識の大部分を事前学習によって獲得しています。したがって、事前学習コーパスに含まれていない情報についてはLLMは回答することができません。例えば、古いコーパスを使って学習したLLMを用いた場合には、現在の日本の首相の名前を正しく回答することはできないかもしれません。また、組織内部に限定されたローカルな情報(自分の所属する組織のメンバーの連絡先など)についても回答することは難しくなります。

(2) hallucination(幻覚)
事前学習コーパスに含まれる情報であっても、LLMは時折誤った回答を返すことがあります。この現象はhallucination(幻覚)と呼ばれ、LLMが抱える課題の1つです。図9は、Intrinsic hallucinationとExtrinsic hallucinationの例を示しています。

hallucinationの例.jpg
図9: hallucination(幻覚)の例(W. X. Zhao et al., A Survey of Large Language Models, 2023Fig. 13より引用)

これらの問題への対策として、検索拡張生成(RAG: Retrieval Augmented Generation)が知られています。RAGでは、LLMの内部にある知識だけで回答をするのではなく、プロンプトの中に回答に必要な情報を含めた上で、LLMに適切な内容を回答させる手続きです。図10にRAGを実行する様子を示しました。

検索拡張生成.jpg
    図10.検索拡張生成(RAG)の処理フロー

(1) 問い合わせ
ユーザからLLMを含むシステムに対して、文章で問い合わせをします。

(2) 検索 ~ (3) 情報取得
問い合わせに関連する情報を外部の情報ソースから検索して取得します。外部の情報ソースはwebページや組織内の文書などを用いることができます。検索クエリの作成や、情報のマッチングにもLLMを利用することができます。

(4) 回答
(3)で取得した情報を用いてユーザに回答を返します。このとき、LLMは(1)の問い合わせ文と、(3)で取得した情報をコンテキストとして与え、それらを参照して回答の文章を生成します。

RAGでは、外部の情報ソースを更新すれば新しい情報が回答できます。また、回答の根拠となる文章もユーザに提示することによって、hallucinationの対策として利用することもできます。

4. おわりに

この記事では、大規模言語モデルの基礎と活用方法について紹介しました。

5. 参考文献

[1] W. X. Zhao et al., A Survey of Large Language Models, May 2023

[2] C. Zhou et al., A Comprehensive Survey on Pretrained Foundation Models: A History from BERT to ChatGPT, 2023

[3] J. Yang et al., Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond, Apr 2023

[4] J. Wei et al., Emergent Abilities of Large Language Models, Jun 2022

[5] R. Lou et al., Is Prompt All You Need? No. A Comprehensive and Broader View of Instruction Learning, 2023

[6] J. Wei et al., Finetuned Language Models Are Zero-Shot Learners, 2021

[7]A. Vaswani et al., Attention Is All You Need, 2017

[8] F. Zhu et al., Retrieving and Reading: A Comprehensive Survey on Open-domain Question Answering, 2021

[9] O. Ram et al., In-Context Retrieval-Augmented Language Models, 2023

[10] B. Peng et al., Check Your Facts and Try Again: Improving Large Language Models with External Knowledge and Automated Feedback, 2023

[11] Z. Jiang et al., Active Retrieval Augmented Generation, 2023

[12] S. Xu et al., Search-in-the-Chain: Towards Accurate, Credible and Traceable Large Language Models for Knowledge-intensive Tasks, 2023

[13] G.Mialon et al., Augmented Language Models: a Survey, 2023

[14] R. Rafailov et al., Direct Preference Optimization: Your Language Model is Secretly a Reward Model, 2023

[15] Forget RLHF because DPO is what you actually need

[16] A. Radford et al., Improving Language Understanding by Generative Pre-Training, 2018

[17] A. Radford et al., Language Models are Unsupervised Multitask Learners, 2019

[18] T. B. Brown et al., Language Models are Few-Shot Learners, 2020

[19] L. Ouyang et al., Training language models to follow instructions with human feedback, 2022

[20] T. L. Scao et al., BLOOM: A 176B-Parameter Open-Access Multilingual Language Model, 2022

[21] H. Touvron et al., LLaMA: Open and Efficient Foundation Language Models, 2023

[22] S. Black et al., GPT-NeoX-20B: An Open-Source Autoregressive Language Model, 2022

[23] B. Peng et al., RWKV: Reinventing RNNs for the Transformer Era, 2023

[24] S. Gunasekar et al., Textbooks Are All You Need, 2023

[25] H. Touvron et al., Llama 2: Open Foundation and Fine-Tuned Chat Models

Ryobot氏のブログ記事: 論文解説 Attention Is All You Need (Transformer)

ゼロつく2のAttentionからTransformerへ

オライリー: ゼロから作るDeep Learning ❷ ―自然言語処理編

52
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
52
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?