Ahogrammer

Deep Dive Into NLP, ML and Cloud

「Kerasのto_categoricalの挙動ってちょっと変わってるよね」という話

今日はマニアックな話。

Kerasを使っている人なら、to_categorical関数を使ったことがある人は多いのではないかと思う。to_cateogorical関数をいつ使うかというと、正解クラスをone-hotエンコーディングして出力に与えたいときに使うことが多い。Keras 2.2.0だと以下のように動作する。

>>> from keras.utils.np_utils import to_categorical
>>> to_categorical([[1, 3]], num_classes=4)
array([[[0., 1., 0., 0.],
        [0., 0., 0., 1.]]], dtype=float32)
>>> to_categorical([[1, 3]], num_classes=4).shape
(1, 2, 4)

ところが、系列長が1の入力を渡すと面白い挙動を示す。

>>> to_categorical([[1]], num_classes=4)
array([[0., 1., 0., 0.]], dtype=float32)
>>> to_categorical([[1]], num_classes=4).shape
(1, 4)

なんと、(1, 1, 4)にならない!

では、keras.backendのone_hotはどうなのかというと、想定通りの動きを示す。

>>> import keras.backend as K
>>> K.one_hot([[1]], num_classes=4)
<tf.Tensor 'one_hot:0' shape=(1, 1, 4) dtype=float32>
>>> K.eval(K.one_hot([[1]], num_classes=4))
array([[[0., 1., 0., 0.]]], dtype=float32)

バグなのか?と思ってソースを見たところ、理由はわからないが意図的にやっていることは間違いない。2017/11/15日のcommitで仕様が変わっている。

github.com

以下のIssueでも議論している。

github.com

理由があろうがなかろうが使用者的には困ることがある。そういうときは以下のようにnumpyのexpand_dimsを使うととりあえず解決できる。

>>> y = to_categorical([[1]], num_classes=4)
>>> y.shape
(1, 4)
>>> y = y if len(y.shape) == 3 else np.expand_dims(y, axis=0)
>>> y.shape
(1, 1, 4)

単語の順序を考慮しつつ文書を固定長で表現する

本日はACL 2017のベストペーパーの1つである以下の論文で用いられている文書表現の方法を紹介します。

この論文は、固有表現認識をFeedForward Neural Networkを使って文書分類的に解くという論文です。手法としては、メンションと呼ばれる固有表現候補の左右に位置するコンテキストを固定長のベクトルで表現してネットワークに入力しています。これら左右のコンテキストを固定長のベクトルで表現する際に使われるのが本記事で紹介するFOFE(Fixed-size Ordinally Forgetting Encoding)です。

f:id:Hironsan:20180613092744p:plain

FOFEの特徴として、単語の位置情報を考慮しつつ文書を固定長で表現できることにあります。今日はこのFOFEを使って語順を考慮しつつ文書を固定長で表現する方法を紹介します。

続きを読む

ディープラーニングで作る固有表現認識器

固有表現認識は自然言語処理の基礎技術であり、様々なタスクの要素技術として使われます。たとえば、情報抽出や対話システム、質問応答といった応用システムの中で固有表現認識は使われることがあります。また、関係認識やEntity Linkingといった基礎技術で使われることもあります。

従来の固有表現認識では、言語に特有な特徴や外部知識に依存した手法が使われていました。これらの手法では、特徴を人間が定義することで、高性能な認識を実現していました。ただ、言語依存の特徴を使うため、モデルを新しい言語に対して適用する際のコストが高くなる問題があります。

本記事では、ディープラーニングを使って言語的な特徴や外部知識に依存しない固有表現認識器を作成します。本文は以下の内容で構成されています。

  • 実装するモデルの説明
  • モデルの実装
  • モデルの学習

全体のコードは以下のGitHubリポジトリにあります。スターしていただけるとうれしいです。

github.com

では、実装していきましょう。

続きを読む