ガジェット通信

見たことのないものを見に行こう

CODE.SCOREと産総研が「スキル測定」の試験時間短縮に機械学習の非負行列分解を採用

DATE:
  • ガジェット通信を≫

CODE.SCOREの試験時間短縮に機械学習のテクノロジーを応用

兼村厚範氏は産総研の研究者だが、ご本人曰く「科学者(Scientist)というより、工学者(Engineer)」だ。

興味を持っている分野は、ヒトから得られたデータの解析、ヒトの情報処理。ヒトとカタカナで表記をしているのは、ヒトを生物の1つとみているため。つまり生物学で人間は「ヒト」と表されるということだ。

一方、「CODE.SCORE」の開発に携わっているチームでは、受検者の負担を減らしたいという企業からの要望を受け、より少ない問題数で分析精度が下がらないようなテストの仕組みを模索していた。

CODE.SCOREは、エンジニアの実務スキルを可視化するサービスとして、2015年4月にローンチした。Webアプリケーション開発(Java)試験や、組み込みソフトウェア開発(C/C++)試験、スマホアプリ開発(iOS)試験、インフラ(LAMP)試験、ITアーキテクトサービス・マネジメント試験など11種類の試験を用意(2016年1月時点)。

CODE.SCOREが提供する試験の大きな特長の一つとして、開発の現場で必要とされるスキルをまるっと計測する試験構成となっていることが挙げられる。

例えば、Javaを使ったWebアプリケーション開発の現場では、Javaのプログラミング能力の他に、設計力やプロジェクトマネジメント力といったことも必要である。この試験構成の特長から、幅広く能力を問うていることから、問題数を削減することが難しい。

では、60問すべての問題を解いてもらう必要がある試験に対して、いかにして試験時間短縮の課題に取り組んだのか。

「60問の問題を例えば半分の30問にしたとしても、うまい方法を使うことで、60問すべてに答えたときよりは少し精度は劣るものの、それなりに高い精度で残りの30問を正解・不正解を予測することができれば、試験時間の短縮につながります。この発想から私の専門の1つである機械学習が使えるのではないかという話になったんです」と、兼村氏は語る。

こうしてリクルートキャリアとの共同研究が始まったという。

行列分解は因数分解のようなもの

ではどんな機械学習のテクノロジーを使ったのか。それが行列分解である。

行列分解とはある行列U(大きさI × J)を2つの行列W(大きさI × K)、H(大きさK × J)の積に分解する(U=WH)というもので、「行列因子分解や行列因子化とも言われている。因数分解のようなもの」と兼村氏は説明する。

例えば、10=5・2、最近の年月日で面白い数字は20151121=674と因数分解できるというようなことだ。整数の10は5と2から構成されており、整数20151121は674が4つ含まれていると解釈できる。

同様に、行列Uを2つの行列WとHに分解するということは、Hで表される成分とWで表される重みの2つの要素から構成されているとみなすということだ(HやWの詳しい意味については後述)。

因子化は隠れた構造を推定するのに使われる。例えばトピックモデルや独立成分分析、スパース辞書学習などである。またデータの構成要素としてどんな成分がどれだけ入っているかを推定し、可視化することもできる。

「例として、文書解析や画像解析、脳活動の解析などがある。文書解析の例でいうと、ハト派、票というワードが出てくれば、政治に関連したトピックであると推定できるし、登板やヒットといったワードがあれば、スポーツに関連したトピックであると推定できる。

同じように画像解析においても、画像の成分を解析することで、木や花の成分が多いから公園の画像ですねとか、あるいはビル成分ばかりだから街の画像といったようなことを推定することができる」と兼村氏は言う。

また因子化は「予測に生かすこともできる」と兼村氏は説明する。例えば今ではセキュリティの必須の技術となったベイジアンスパムフィルタも、メールデータセットを解析して、スパムトピック成分をどれだけ多く含むか否かで分類するように発展させることができる。広告やリコメンデーションも同様だ。

「脳活動解析については実用化への道のりはまだ遠いが、脳のどの部分がいつ活動しているが分かってくると、医療やリハビリなどに役立つほか、将来的にはヒトの脳や知性の理解につながっていくと思う」と兼村氏は説明する。

因子化の解析フローは次のような図で表すことができる。

「なんらかのデータセットがあり、それを成分推定する。成分推定の方法は行列分解を使う方法もあるが、トピック推定であれば、LDAやLSIという方法もある。そしてその結果を使って可視化したり、予測したりするという流れになる」(兼村氏)

続いて行列分解の説明が行われた。

行列分解はデータを行列として表現するところから始まる。

次にデータを分解する、つまりU=WHという因子分解をする。

行列U=WHは縦がI行、横がJ列の大きさ。Iはテストデータに例えると受検者数。Jはテストで言うと問題の数となる。

行列Uの第1行目であるu1はHの各行であるh1からhKまでの(重み付きの)足し算となっており、その重みがWの第1行であるw1である。

第i行目についても同様に、h1からhKまでを重みwiで足し合わせたものとなっている。

非負行列分解で「欠測推定」と「適応出題」が可能に

CODE.SCOREの実際に解答する問題数削減に使った技術が、行列分解にテストデータの性質に応じた要素を入れた「非負行列分解です」と兼村氏は言う。W、Hの各要素を0以上、つまり非負に制約するという行列分解法である。

この技術を使った理由は、実際のテストデータは正か誤、つまり0か1しかないので、非負であることが一つ。もう一つは非負にすると部分ごとの表現が得られることだ。部分ごとの表現とは一部の要素のみに値を持ち、ほかは全部ゼロというものである。ほぼ同じことを別の言葉で「スパース」ともいう。

これをわかりやすく説明するために兼村氏は、顔画像に対する非負行列分解の結果と主成分分析の結果を対比した図を表示した。非負行列分解をしたものを見ればわかるとおり、行列Hのある行は目のあたり、また別のある行は首のあたり、鼻のあたりという、顔画像を構成する要素成分に分解されている。

ここで、Hの各行は本来1次元的に配列されたベクトルだが、図には画像として2次元に並べ直したものを表示している点に注意してほしい。一方の主成分分析は、平均画像とその差分という形でデータが分解されており、いずれも部分ごとの表現は得られていない。

それではデータUからWとHをどうやって推定すればよいのか。「いろいろやり方はあるが、乗法的更新ルールという単純な方法を使った」と兼村氏は言う。

入力としては非負行列Uとトピック数Kを手動で与えて、そこからU=WHとなるようなW、Hを出力として求めるというわけだ。乗法的更新ルールの計算手順は次の通りである。

ステップ1:WとHの初期値を「適当」に設定する。初期値は乱数や主成分分析の結果でもよく、ただし必ず非負になるように前処理をする。

ステップ2:WとHの各成分を次の式でどんどん更新していく。更新幅が充分小さくなったときなど適当なタイミングでストップする。

hkj (wik)の更新ルールの式のうち色づけしたところに注目すると、新しいhkj (wik)は、古いhkj (wij)に、W, H, Uから計算されるある係数(色づけしていない)をかけ算したものになっている。WもHもUも全部非負なのでこの係数も非負であり、hkjとwikの初期値が非負であればかけ算も割り算もその結果は全体として非負になる。

つまり、非負の値をかけていくと、正×正=正なので更新前後で非負性が保たれるというわけだ。これをCODE.SCOREの実際の受検結果のデータに適用した。データの一部が次の表である。

0と1の表になっており、1行1行がu i(1人1人の受検者の解答パターン)となっている。この解答パターンを行列Uとして非負行列分解し、成分(潜在スキルセット、トピック:全員に共通)とその重み(個人ごとに異なる)に分解するのである。

こうして共通するスキルセットをどれくらいの重みで持っているか推定することで「この問題に正解したらこの問題にも正解するんじゃないかという予測ができる」というわけだ。

先のテストデータを非負行列分解した結果が以下である。縦軸が能力(成分)、横軸は問題である。

これは問題ごとの相関構造を示しているが、「正解・不正解のパターンの裏側には直接はデータから見えない能力があり、1つの能力を持っていると複数の問題に対する解答能力が高まるという意味づけになっている。

横1行が1つの能力で、この能力が高いと、赤く塗られている問題が得意ということ。例えるなら1つの能力はプロジェクトをどんどん推進するフォワードタイプとか、縁の下の力持ち的なディフェンダータイプとかに対応していて、タイプごとに得意な問題パターンが異なると考えてもらうとよい」と兼村氏は説明する。

下記の図は、Wを可視化したものであり、一人一人の受検者がどんなスキルをどれくらい持っているかが示されている。縦軸が受検者に、横軸が能力に対応する。

横1列が1人分の能力値である。第1列が赤いということは、1つ目の能力が高いということであり、受検者によって2つ目と3つ目の能力を併せ持っていたり、どの能力も満遍なく持っていたりする。

こうすることで、すべての問題に解答しなくても、たとえば3分の2程度の問題に解答してもらえれば、それを基に隠れた5つのスキルセットをどのくらいの割合で持っているかを推定し、残りの答えていない18問に対する正誤の予測ができるようになるというわけだ(欠測推定)。

そしてもう一つ、非負行列分解を使用し、スキルセットの推定結果を加味することで、正解・不正解の予測がほとんど間違いなくできているであろう問題と、正解・不正解の予測に自信がない問題との弁別が可能になる。

予測に自信があって確実性の高い問題よりも、予測に自信がなくより曖昧な問題に解答してもらった方が情報量が大きい。フォワードタイプの能力を持っているとすでに判明した受検者には、推進力を測る問題よりも、縁の下の力持ちを測る問題を解いてもらうべきだ。

したがって、まだ予測が曖昧な問題から出題していくことで、効率的な情報収集を実現する出題順序を決めることができる(適応出題)。

これは機械学習でいう能動学習という技術の応用例にもなる。

「各個人のスキルを測定するのに適した順番での出題(適応出題)と欠測推定が可能になることで、問題数の削減ができる」というわけだ。推定の精度がどのくらいだったか、その実例は次のとおりだ。

横軸が問題(全58問)で、縦軸が正誤(0が誤答、1が正答)に対応する。△が実際の値でぴったり0か1になっており、○が潜在スキルセットの重みに基づいて予測した値である。予測値は0.5を閾値として0か1に割り振ってスコアを算定する。

真のスコアは44点のところ、予測スコアは39点と5点ずれたが、「58問中40問解答してもらい、18問推定したときのずれは、相場データ全体に対して平均的に3問ぐらいとなった」兼村氏は語り次のグラフを示した。

「このグラフから読み取れる通り、答えてもらう問題数が少なくなると、当然誤差が大きくなる。58問全部答えてもらうと誤差はゼロ。ただ時間はかかるということになる」

この非負行列分解を活用したテスト理論は、現在、特許出願準備中だという。またこの理論を応用して試験時間を短縮したものは、CODE.SCOREから新サービスとして1月中に登場する予定だという。

スキル測定の精度を保ちつつ受検者の負担を減らすことが重要な、採用シーンなどでの活用が考えられている。新しいサービスの登場に注目したい。

関連情報

エンジニアの実務スキルを可視化するサービス「CODE.SCORE」
試験時間が90分から60分以内に!採用シーンで導入しやすい新サービスが登場
人事・脳科学・統計学の3つの視点から考える「エンジニアが辞めない組織」
論文「能力テスト得点の非負行列分解

カテゴリー : デジタル・IT タグ :
CodeIQ MAGAZINEの記事一覧をみる ▶
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。