プロジェクトについて
プログラミング言語処理の分野には多くの興味深い問題があり、その自動解決は開発者にとって便利なツールを作成するのに役立ちます。
プログラムのソース コードは、自然言語のテキストとは多くの点で異なりますが、トークンのシーケンスと考えることもでき、同様の方法を使用できます。例えば、自然言語処理の分野ではBERT言語モデルが積極的に利用されています。トレーニングのプロセスには 2 つの段階が含まれます。ラベルのないデータの大規模なセットでの事前トレーニングと、ラベルの付いた小さなデータセットでの特定のタスクに対する追加のトレーニングです。このアプローチにより、多くのタスクを非常に優れた品質で解決できます。
最近の作品 ( 1、 2、 3 ) は、プログラム コードの大規模なデータセットで BERT モデルをトレーニングする場合、この領域のいくつかのタスクにうまく対処できることを示しました (たとえば、不適切に使用された変数のローカリゼーションと削除、メソッドへのコメントの生成など)。 .
このプロジェクトは、他のソース コード タスクでの BERT の使用を調査することを目的としています。特に、コミット メッセージを自動的に生成するタスクに焦点を当てました。
タスクについて
なぜこのタスクを選んだのですか?
まず、バージョン管理システムは多くのプロジェクトの開発に使用されているため、この問題を自動的に解決するツールは幅広い開発者に関連する可能性があります。
次に、このタスクに BERT を使用すると良い結果が得られるという仮説を立てました。これにはいくつかの理由があります。
- 既存の作品 ( 4、5、6 ) では、データはオープン ソースから収集され、本格的なフィルタリングが必要になるため、トレーニングの例はほとんどありません。これは、小さなデータセットでトレーニングする BERT の機能が役立つ場所です。
- プロジェクトに取り組んでいたときの最先端の結果は、トランスフォーマー アーキテクチャ モデルにありました。これは、小さなデータセット ( 6 )に対してかなり具体的な方法でプリリーチされていました。BERT ベースのモデルと比較するのは興味深いことでした。BERT ベースのモデルは、異なる方法で事前トレーニングされていますが、はるかに多くのデータに基づいています。
学期中、私は次のことをしなければなりませんでした。
- 主題分野を研究する。
- データセットを見つけて、入力データの表現を選択します。
- トレーニングと品質評価のためのパイプラインを開発する。
- 実験を行います。
データ
このタスクにはいくつかのオープン データセットがありますが、最もフィルタリングされたものを選択しました ( 5 )。
データセットは、上位 1000 のオープン GitHub リポジトリから Java 言語で収集されました。フィルタリング後、元の数百万の例のうち、約 30,000 が残っています。
例自体は、git diff コマンドの出力と対応する英語のショート メッセージのペアです。 :それはこのようなものになります
-せいぜい100と30トークン、それぞれのデータセット内の両方の変化やメッセージは短いですが。
コミットのメッセージを自動的に生成する問題を調査する既存の作業のほとんどでは、git diff からの一連のトークンがモデルに供給されます。
別のアイデアがあります: 変更前と変更後の 2 つのシーケンスを明示的に選択し、編集距離を計算するための古典的なアルゴリズムを使用してそれらを位置合わせします。したがって、変更されたトークンは常に同じ位置にあります。
理想的には、いくつかのアプローチを試して、それらがこの問題の解決の質にどのように影響するかを理解したいと思います。最初の段階で、私はかなり単純なものを使用しました。変更の前後に、2 つのシーケンスがモデル入力に供給されましたが、アライメントは行われませんでした。
シーケンス間タスクの BERT
コミットのメッセージを自動的に生成するタスクの入力データと出力データは両方ともシーケンスであり、その長さは異なる場合があります。
このような問題を解決するには、通常、次の 2 つのコンポーネントで構成されるエンコーダー デコーダー アーキテクチャが使用されます。
- エンコーダ モデルは、入力シーケンスに基づいてベクトル表現を構築します。
- モデルデコーダーは、ベクトル表現に基づいて出力シーケンスを生成します。
BERT モデルは Transformer アーキテクチャーのエンコーダーに基づいており、それ自体はそのようなタスクには適していません。本格的なシーケンス間モデルを取得するには、いくつかのオプションが可能です。最も簡単な方法は、何らかのデコーダーを使用することです。Transformer アーキテクチャーのデコーダーを使用したこのアプローチは、たとえば、ニューラル機械翻訳のタスク ( 7 ) のタスクで、それ自体がよく示されています 。
パイプライン
実験を行うには、そのようなシーケンス間モデルの品質をトレーニングして評価するためのコードが必要でした。
BERT モデルを操作するために、HuggingFace の Transformers ライブラリを使用し、一般的な実装には PyTorch フレームワークを使用しました。
最初は PyTorch の経験がほとんどなかったので、他のアーキテクチャのシーケンス間モデルの既存の例に大きく依存し、徐々に自分のタスクの詳細に適応していきました。残念ながら、このアプローチは品質の低いコードを大量に生成する結果となりました。
ある時点で、リファクタリングを開始し、実質的にパイプラインを書き直すことが決定されました。PyTorch Lightning ライブラリはコードの構造化に役立ちました。これにより、モデルのすべてのメイン ロジックを 1 つのモジュールに収集し、さまざまな方法で自動化できます。
実験
実験中、事前トレーニング済みの BERT モデルを使用することでこの分野の最先端の結果が改善されるかどうかを理解したいと思いました。
コードでトレーニングされた BERT モデルの中で、CodeBERT ( 1 ) だけが私たちのところに来ました 。これは、トレーニング例に Java プログラミング言語が含まれていたからです。まず、CodeBERT をエンコーダーとして使用して、さまざまなアーキテクチャのデコーダーを試しました。
- GRU.
, - . GRU Transformer, , .
- . - Transformer.
, — .
, GPT-2 (8) — Transformer, , — distilGPT-2 (9).
秋学期にそれ以上の実験を行う時間が十分ではなかったので、私はそれらを冬に続けました。入力を表す他の方法をいくつか検討しました。変更の前後でシーケンスを整列させ、git diff をファイルしただけです。
実験の主な結果は次のとおりです。
まとめると
一般に、このタスクに CodeBERT を使用する利点についての仮定は確認されていません。すべての場合で、ゼロからトレーニングした Transformer モデルの方が品質が高いことがわかりました。この分野での最良の方法は、CoreGen6 モデルのままです。これも Transformer ですが、著者が提案した目的関数を使用してさらに事前トレーニングされています。
この問題を解決するために、より多くのアイデアを考えることができる:例えば、プログラムコード(での作業時に頻繁に使用される抽象構文木に基づいてデータ表現をしてみてください 10、 11)、他の事前トレーニング済みモデルを試すか、リソースが利用可能な場合はフィールド固有の事前トレーニングを行います。春学期では、得られた結果のより実用的なアプリケーションに焦点を当て、コミットへのメッセージの自動補完に取り組みました。これについては第 2 部でお話します :)
最後に、プロジェクトに参加するのは本当に面白かったと言いたいです。私は自分自身の新しい分野に飛び込み、この間多くのことを学びました。プロジェクトの作業は非常によく組織されていて、私のリーダーには感謝しています。
ご注目ありがとうございます!
のソース
- 風水、張y、他 「Codebert: プログラミングと自然言語のための事前トレーニング済みモデル。」2020年
- Buratti, Luca, et al. «Exploring Software Naturalness through Neural Language Models.» 2020
- Kanade, Aditya, et al. «Learning and Evaluating Contextual Embedding of Source Code.» 2020
- Jiang, Siyuan, Ameer Armaly, and Collin McMillan. «Automatically generating commit messages from diffs using neural machine translation.» 2017
- Liu, Zhongxin, et al. «Neural-machine-translation-based commit message generation: how far are we?.» 2018
- Nie, Lun Yiu, et al. «CoreGen: Contextualized Code Representation Learning for Commit Message Generation.» 2021
- Rothe, Sascha, Shashi Narayan, and Aliaksei Severyn. «Leveraging pre-trained checkpoints for sequence generation tasks.» 2020
- Radford, Alec, et al. «Language models are unsupervised multitask learners.» 2019
- Sanh, Victor, et al. «DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter.» 2019
- Yin, Pengcheng, et al. «Learning to represent edits.» 2018
- Kim, Seohyun, et al. «Code prediction by feeding trees to transformers.» 2021