プログラムから説明文章を生成するAI~ CodeBERT~

SCSK株式会社 R&Dセンター 技術開発部
瀬在 恭介 Kyousuke Sezai

この記事では自然言語処理の応用例として、プログラミング言語を学習した「CodeBERT」というモデルを用い、プログラムコードから説明文章を生成するAIについて紹介します。

CodeBERTとは

自然言語処理の分野では、2018年に登場した自然言語処理モデル「BERT」が様々な場所で使用され、より発展的な研究も行われるようになりました。

中でも注目されているのが「マルチモーダル学習」という手法です。
この学習手法では、「画像」「テキスト」「音声」「動画」といった複数の形式の異なる情報を学習データとして使用します。これにより大量の情報を得ることで、性能向上や用途の拡充を目指します。今回の「CodeBERT」はBERTで使用される一般的なテキストに加え、プログラミング言語も同時に学習させたモデルであり、プログラミング言語と自然言語両方の意味を理解するモデルと言えます。

また、マルチモーダルに関連して、1つの形式の学習データを使用することを「ユニモーダル」、2つの異なる形式のデータを使用することを「バイモーダル」と呼びます。

CodeBERTに使用する学習データ
論文: CodeBERT: A Pre-Trained Model for Programming and Natural Languages

学習データは上記の様なプログラムコードに加えて、赤枠内のプログラムコードを説明したコメントも学習させています。

CodeBERTに学習させたデータセット数
論文: CodeBERT: A Pre-Trained Model for Programming and Natural Languages

CodeBERT は、Go、Java、JavaScript、PHP、Python、Rubyの6つのプログラミング言語について、合計約210万のバイモーダルデータと約640万のユニモーダルデータを使用して学習しています。

学習済みCodeBERTの使用

学習済みBERTを簡単に使用する方法として「transformers」というライブラリを使用する方法があります。 今回のCodeBERTは、Microsoftで学習されたモデルが「transformers」で提供されており、これを利用してCodeBERTを呼び出していきます。

▼transformersを使用した学習済みCodeBERTの呼び出し

import torch
from transformers import RobertaTokenizer, RobertaConfig, RobertaModel
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
tokenizer = RobertaTokenizer.from_pretrained("microsoft/codebert-base-mlm")
model = RobertaModel.from_pretrained("microsoft/codebert-base-mlm")

また、CodeBERTは学習タスクとして、プログラムの穴埋め問題を行っているため、プログラムの一部を穴埋め状態にし、正しい予測が可能か検証してみます。

▼「if (x is not None) mask」のmaskを予想するタスク

from transformers import RobertaConfig, RobertaTokenizer, RobertaForMaskedLM, pipeline
model = RobertaForMaskedLM.from_pretrained("microsoft/codebert-base-mlm")
tokenizer = RobertaTokenizer.from_pretrained("microsoft/codebert-base-mlm")
CODE = "if (x is not None) < mask > (x>1)"
fill_mask = pipeline('fill-mask', model=model, tokenizer=tokenizer)
outputs = fill_mask(CODE)
print(outputs)

回答は以下が出力されました。(左から上位5個出力)

'and', 'or', 'if', 'then', 'AND'

正しく、if文で使用されそうな単語が選ばれています。

CodeBERTを使用した説明文章生成タスクの実施

プログラムから文章を生成するタスクを実施していきます。
説明文章生成タスクを実施する為のサンプルコードは以下で提供されています。
https://github.com/microsoft/CodeBERT
内容は、GitHubに上がっているプログラムコードのURLとその説明文章(英語)がデータとして保管されており、以下のように様々な言語データが用意されています。

PLTrainingDevTest
Python251,82013,91414,918
PHP241,24112,98214,014
Go167,2887,3258,122
Java164,9235,18310,955
JavaScript58,0253,8853,291
Ruby24,9271,4001,261
言語データの種類

今回はCodeBERTの後続に文章生成を得意とする「Seq2seq」モデルを結合させ、プログラムコードをインプットに説明文章をアウトプットするモデルを使用しました。
学習済みモデルを使用し、実際にテストデータで生成した文章が以下になります。

▼生成文章と正解文章の比較

正解:Downloads Dailymotion videos by URL .
予測:Download a file from a URL 

最後に

CodeBERTの生成文章は短くまだ実用段階には至っていませんが、プログラムコードから説明文章を生成できました。将来的にはエンジニアリングをサポートし、システム開発に貢献するモデルが開発されるようになると予想します。
また、自然言語処理分野で名を馳せたBERTは、プログラミングだけでなく、動画や音声といった様々な分野への応用研究が進められています。
自然言語処理AIはビジネスの現場での活用がまだ限られていますが、近い将来当たり前のように役立つ時代が来ると期待されます。

Right Menu Icon