データ化学工学研究室物語
第I部 研究室配属前夜のデータ化学工学
研究室配属前の学部三年生が、AI・機械学習を化学・化学工学の研究に使う考え方を学ぶ。
第5章 化学を数字にする
新人トレーニングの四週目に与えられた課題は、化学構造と数字の間を行き来することだった。
共有した polymer_repeat_units.smi と descriptor_definition.pdf を確認してください。
polymer_descriptor_1 と polymer_descriptor_2 が、繰り返し単位のどの情報を数値化したものか説明してください。
サンプルプログラムを用いて、少なくとも三つの構造について記述子を計算してください。
同じ記述子の値をもつ構造が、同じ化学構造といえるかも考えてみてください。
第4章の報告会が終わった日の夕方、先輩から slack に届いたファイルを、遥は研究室の席で開いた。
最初に表示されたのは、見慣れた構造式ではなかった。
polymer_001 [*]CC[*]
polymer_002 [*]CCO[*]
polymer_003 [*]Oc1ccc(S(=O)(=O)c2ccc(O[*])cc2)cc1
英字、数字、括弧、等号、アスタリスクが、一列の文字として並んでいる。
遥は、一つ目なら何となく炭素が二つ並んだ構造だと分かった。二つ目には酸素がある。三つ目にはベンゼン環らしい部分と、硫黄と酸素がある。
けれど、紙に描かれた構造式と、画面上の文字列とは、まだ同じものには見えなかった。
descriptor_definition.pdf を開くと、最初に SMILES という言葉が説明されていた。
SMILES:原子と結合のつながりを、一行の文字列で表現する方法。
今回のトレーニングでは、高分子の繰り返し単位の両端にある結合位置を * で表す。
* は実際の元素ではなく、隣の繰り返し単位につながる位置を示す。
遥は、三つの文字列を一つずつ構造描画ソフトに入力した。
一つ目は、炭素鎖の両端に接続点がある単純な構造になった。二つ目では、炭素鎖の途中に酸素原子が現れた。三つ目には、二つの芳香環とスルホニル基、エーテル結合が含まれていた。
同じ文字列が、構造式として画面に現れる。
化学構造を文字にしたものが SMILES であり、その文字列から、再び構造を組み立てられるらしい。
遥はノートに書いた。
構造式:人が目で見て理解しやすい。
SMILES:構造のつながりを文字列として保存・処理しやすい。
書き終えたところで、少し気になった。
SMILES にすれば、機械学習はそのまま化学構造を理解できるのだろうか。
対話型 AI に尋ねると、SMILES は文字列のままモデルへ入力する場合もあるが、多くの機械学習では、分子記述子やフィンガープリントなどの数値に変換すると説明された。
遥は、すぐにその説明を発表資料へ入れず、研究室から共有された入門資料でも同じ用語を確認した。
記述子。
化学構造の特徴を、一つまたは複数の数字で表したもの。
分子量、原子の数、芳香環の数、官能基の数、極性に関係する値などが例として挙げられていた。
第4章の最後に見た数字の列が、ようやく構造式とつながった。
descriptor_definition.pdf の次のページには、二つの記述子の定義が書かれていた。
polymer_descriptor_1:繰り返し単位の重原子のうち、芳香族原子が占める割合。単位なし。
polymer_descriptor_2:繰り返し単位の重原子のうち、炭素以外の原子が占める割合。単位なし。
接続位置を示す * は、原子数に含めない。
第3章では、記述子 A と記述子 B としか分からなかった列に、具体的な意味が入った。
一つ目は、芳香環を多く含むかどうかに関係する。
二つ目は、酸素、窒素、硫黄などのヘテロ原子を、どの程度含むかに関係する。
遥は三つの構造を見比べた。
polymer_001 には芳香族原子もヘテロ原子もないため、二つの記述子はどちらも小さいはずだ。
polymer_002 には酸素があるため、polymer_descriptor_2 は polymer_001 より大きい。
polymer_003 には芳香環が多いため polymer_descriptor_1 が大きく、酸素と硫黄もあるため polymer_descriptor_2 もゼロではない。
計算する前に、結果の大小を予想できた。
その予想をノートに残してから、遥はサンプルプログラムを開いた。
プログラムでは、SMILES を読み込み、接続位置を示す * を除いて原子を数え、芳香族原子とヘテロ原子の割合を計算していた。
三つの構造について実行すると、大小関係は予想と一致した。
遥は少し安心した。
ただプログラムを動かして数字を得るのではなく、化学構造から結果を予想し、計算結果と照らし合わせることができた。
そこで遥は、課題に書かれていないことを一つ試した。
polymer_001 の炭素鎖に酸素を加えた polymer_002 では、どの記述子が変わるか。
さらに、炭素鎖を芳香環に置き換えた簡単な仮想構造では、どの記述子が変わるか。
structure_a = “[*]CC[*]”
structure_b = “[*]CCO[*]”
structure_c = “[*]c1ccc([*])cc1”
三つの文字列を入力し、同じプログラムで計算した。
structure_b ではヘテロ原子の割合が増え、structure_c では芳香族原子の割合が増えた。
記述子の定義どおりだった。
遥は結果をスライドに貼り付けかけて、題名の横に「仮想例」と書き加えた。
この構造が、実際に目的の高分子として合成できるかを確認したわけではない。記述子の動きを理解するために、構造を単純に変えただけだった。
第1章で先輩が言っていたことを思い出した。
AI やモデルが数字を出しても、実験できるかどうかは別に確認しなければならない。
今回はモデルの候補ですらない。記述子の計算練習である。
遥はスライドの説明を修正した。
構造の一部を変えると、定義に対応した記述子が変化した。
ただし、この仮想構造の合成可能性や膜形成性は検討していない。
作業を続けるうちに、もう一つ疑問が生まれた。
二つの記述子の値が同じなら、二つの化学構造は同じなのだろうか。
課題の最後に書かれていた問いだった。
遥は、簡単な例から考えることにした。
エタノール:CCO
ジメチルエーテル:COC
どちらも炭素原子が二つ、酸素原子が一つで、芳香族原子はない。
芳香族原子の割合とヘテロ原子の割合だけを計算すれば、同じ値になる。
分子量も同じだった。
しかし、一方には水酸基があり、もう一方では酸素が二つの炭素の間にある。原子のつながり方が違い、物性も同じではない。
遥は画面上に二つの構造を並べた。
同じ数字になる。
でも、同じ構造ではない。
記述子は、化学構造のすべてをそのまま保存しているのではない。
構造から、決められた特徴だけを取り出している。
遥はノートに書いた。
記述子は、化学構造の翻訳。
ただし、翻訳するときに残す情報と、失う情報がある。
翌日の午後、紺色のパーカーの先輩が研究室に来た。
遥は、エタノールとジメチルエーテルの例を画面に映した。
「この二つは、polymer_descriptor_1 と polymer_descriptor_2 では区別できません」
先輩は二つの構造を見た。
「どうして区別できないのでしょう」
「どちらの記述子も、芳香族原子とヘテロ原子の割合しか見ていないからです。原子のつながり方や、水酸基があるかどうかは表していません」
「では、記述子が悪いのでしょうか」
遥は少し考えた。
「悪いというより、この二つの記述子だけでは足りない、だと思います。目的によっては十分かもしれませんが、官能基や結合の違いが物性に関係するなら、別の特徴量が必要です」
先輩はうなずいた。
「記述子には、何でも表せる万能なものがあるわけではありません。何を区別したいかによって、必要な記述子が変わります」
先輩は、共有資料の後半を開いた。
そこには、0 と 1 が長く並んだ表があった。
「これは、フィンガープリントの例です」
「指紋、ですか」
「化学構造の中に、ある部分構造があるかどうかを、0 と 1 の並びで表します。記述子が分子量や原子数のような数値を計算する方法だとすると、フィンガープリントは構造中のパターンを記録する方法の一つです」
サンプルプログラムには、次の設定があった。
radius = 2
n_bits = 2048
何を意味するのか、遥はまだ完全には理解できなかった。
ただ、エタノールとジメチルエーテルを入力すると、0 と 1 の並びは同じにはならなかった。
原子の種類だけでなく、周囲のつながり方の違いが反映されているらしい。
「それなら、記述子よりフィンガープリントを使えばよいのでしょうか」
「いつでも、とは限りません」
先輩は、2048 個の列が並んだ表を指した。
「情報を細かく表せますが、列の数が多くなります。どの列がどんな化学的意味か説明しにくいこともあります。サンプルが少ないのに特徴量が多すぎれば、モデルが今あるデータだけに合わせすぎる危険もあります」
第4章で学んだ、図の見え方と少し似ていた。
情報を細かく見ようとすれば、偶然の違いまで重要に見えてしまうことがある。
「記述子とフィンガープリントの、どちらが正解ということではないんですね」
「そうです。目的、データ数、モデル、解釈したい内容を考えて選びます。両方を使って比較することもあります」
先輩は、polymer_003 の繰り返し単位を拡大した。
「それから、高分子では別の注意もあります」
「繰り返し単位だけでは、実際の高分子を全部表せないことですか」
遥が尋ねると、先輩は少し驚いたようにうなずいた。
「そうです。分子量、分子量分布、末端基、分岐、架橋、立体規則性、共重合体なら組成や並び方。さらに膜にした後の結晶性や密度、分子鎖の詰まり方もあります」
「同じ繰り返し単位でも、同じ膜性能になるとは限らない」
「その通りです。繰り返し単位の記述子は、材料を表す一部の情報です」
遥は、polymer_descriptor_1 と polymer_descriptor_2 の列を見た。
数字になったことで、構造をモデルへ入力できる。
けれど、数字になったことで、構造のすべてが分かったわけではない。
「AI に、透過性能の予測に使えそうな高分子の特徴量を聞いたら、ガラス転移温度、密度、自由体積なども提案されました」
遥は、先ほどの対話型 AI の回答を見せた。
「確かに、性能と関係しそうです。でも、それらは高分子を合成して膜を作った後に測るものもありますよね」
「そこに気づいたのは大切です」
先輩は、第3章で作ったデータ辞書を開いた。
「今回、何をしたいのでしたか」
「高分子を合成したり膜を作ったりする前に、構造や作製条件から性能を予測したいです」
「その時点で、実測の密度やガラス転移温度は分かりますか」
「分かりません」
「では、直接の入力にすると、モデルを使いたいときに値を準備できません」
「予測精度が高くなっても、設計には使えない……」
「そういうことがあります。もし密度やガラス転移温度を別のモデルで予測できるなら、その予測値を使う方法は考えられます。ただし、そこで生じる誤差も含めて検討する必要があります」
遥はノートに、二つのモデルを書き分けた。
合成前の材料設計モデル:化学構造から計算できる特徴量と、事前に設定できる作製条件を使う。
作製後の性能推定モデル:測定済みの密度やガラス転移温度なども、目的に応じて使える。
同じ高分子膜の性能を予測するモデルでも、使う時点が違えば、入力にできるものが変わる。
第3章で考えた「予測したい時点」が、化学構造の数値化にも戻ってきた。
新人トレーニング四回目の進捗報告会では、遥は最初に、SMILES で表した三つの繰り返し単位を映した。
続いて、polymer_descriptor_1 と polymer_descriptor_2 の定義を説明した。
「今回は、芳香族原子の割合とヘテロ原子の割合を使っています。どちらも、繰り返し単位の構造から合成前に計算できます」
先生が尋ねた。
「化学構造を二つの数字にしたことで、何ができるようになりましたか」
「高分子ごとの構造の違いを、表の列としてモデルに入力できるようになりました。芳香族原子やヘテロ原子の割合と、透過係数や選択性との関係も調べられます」
「反対に、何ができなくなりましたか」
遥は、エタノールとジメチルエーテルの例を示した。
「二つの記述子に含まれていない構造の違いは、区別できません。原子のつながり方や官能基の種類が違っても、同じ値になることがあります」
先生はうなずいた。
「数値化は、単なる形式変換ではありません。何を情報として残し、何を捨てるかを決める操作です」
先生は polymer_descriptor_2 と co2_permeability の散布図を指した。
「この図では、ヘテロ原子の割合が高いほど透過係数が高いようにも見えます。ヘテロ原子を増やせば、透過係数は必ず上がりますか」
第4章なら、相関と因果は違うと答えればよかった。
今回は、それだけでは足りない気がした。
「必ず上がるとは言えません。ヘテロ原子といっても、酸素、窒素、硫黄などで性質が違います。同じ原子でも、どの官能基に入り、どこに配置されているかで影響は変わります。それに、製膜条件や分子鎖の詰まり方も関係すると思います」
「では、この記述子は使えませんか」
「使えないとは言えません。今回のデータの範囲で関係を調べるための、粗い特徴量の一つです。ただ、この一つだけから化学的な結論を決めないようにします」
先生は次のスライドへ進めるよう促した。
遥は、課題外で作った三つの仮想構造を示した。
「構造を一部変えると、定義に対応して記述子が変化することを確認しました。ただし、これらが合成可能な高分子かは確認していません。記述子の意味を理解するための仮想例です」
先生が尋ねた。
「なぜ、課題にない構造まで計算したのですか」
遥は少し緊張した。
「与えられた三つだけでは、プログラムを実行して結果を受け取っただけになると思ったからです。自分で構造を一つずつ変えて、どの記述子が動くかを確かめたかったです」
先生は短くうなずいた。
「その一歩は大切です。計算結果を見る前に予想を置いたこともよいと思います」
続いて、フィンガープリントの説明をした。
「原子のつながり方をより細かく区別できますが、特徴量の数が増え、解釈しにくくなることがあります。記述子とフィンガープリントのどちらか一方が常に優れているわけではありません」
先生は尋ねた。
「では、最終的に何を使いますか」
以前の遥なら、正解を知らないため答えられなかったかもしれない。
今は、まだ決められない理由を説明できた。
「まず、構造から計算できる複数の記述子を準備し、どの情報が重複しているか、どの情報が性能と関係しそうかを確認したいです。フィンガープリントを使うモデルも作り、同じ分け方で予測性能を比較したいです。ただし、サンプル数に対して特徴量が多すぎないかも確認します」
「よいと思います。ただし、予測性能だけで決めると、今あるデータに合わせすぎることもあります。解釈したいのか、未知候補を予測したいのか、設計に使いたいのかも忘れないでください」
遥は、研究目的の欄に線を引いた。
モデルの前に、特徴量を決める。
特徴量の前に、何を予測し、いつ使うかを決める。
全部がつながっていた。
報告会のあと、先輩から新しいファイルが slack に共有された。
polymer_descriptors_extended.csv
各高分子の繰り返し単位から、128 個の記述子を計算したデータです。
次回は、似ている高分子と似ていない高分子を、数字から考えてみてください。
特徴量ごとの値の大きさが違うことにも注意してください。
遥はファイルを開いた。
polymer_descriptor_1 と polymer_descriptor_2 の右に、さらに多くの列が続いていた。
原子数に関係する列。
官能基に関係する列。
分子の形や極性に関係する列。
画面を横にスクロールしても、列の終わりがなかなか見えない。
一つの高分子は、128 個の数字で表されていた。
二つの数字では見落としていた違いも、今度は表せるかもしれない。
しかし、128 個の数字を人の目で同時に比べることはできない。
ある列では近く、別の列では遠い二つの高分子を、似ていると呼んでよいのだろうか。
分子量に関係する値が大きい列と、0 から 1 の間しか取らない割合の列を、そのまま比べてよいのだろうか。
遥は、第4章で作った二変数の散布図を思い出した。
二つの変数なら、横軸と縦軸にできる。
では、128 個の変数を、どのように見ればよいのだろう。
ノートの新しいページに、遥は書いた。
化学構造を数字にすると、モデルで扱える。
ただし、数字にした方法によって、モデルが見える化学も変わる。
その下に、次の問いを書いた。
128 個の数字で表された高分子を、どうすれば人が見られる形にできるか。
数字の大きさが違う特徴量同士を、どうすれば公平に比べられるか。
似ている材料と、似ていない材料を、どう決めるか。
化学構造と表の間に、記述子という橋が架かった。
けれど、その橋を渡った先には、人の目では見渡せない広い空間があった。
遥は、128 列の表をもう一度横へスクロールした。
次は、この数字の空間に、地図を作る必要がある。
===
続きはこちら
