u++の備忘録

論文メモを残そうと思った

 「論文メモを残そう」という、ただの感想文

動機

 これまで乱読していたので、一定の形式で残したい。

形式

 取りあえず「論文メモ」で検索して最初にヒットした以下のページの内容にすることに。

lafrenze.hatenablog.com

 メモする内容は以下の通り。

  1. どんなもの?
  2. 先行研究と比べてどこがすごい?
  3. 技術や手法のキモはどこ?
  4. どうやって有効だと検証した?
  5. 議論はある?
  6. 次に読むべき論文は?

『画像認識』第4章「コーディングとプーリング」の要点まとめ

 『画像認識』(機械学習プロフェッショナルシリーズ)*1の第4章が、サラッと読もうとしたところ結構骨の折れる内容だったので、自分用の備忘録として要点まとめを作ることにしました。


第4章「コーディングとプーリング」の目次

  1. コーディングとプーリングの概要
  2. 確率分布を利用したコーディング
  3. 局所特徴のコードワードによる再構築
  4. 多様体学習
  5. 特徴関数の線形内積によるカーネル関数近似
  6. 空間情報の活用

コーディング

局所特徴を認識に有効な次元数のベクトルに変換する操作

 コーディングは、以下の式のように分類に有利な高次元空間への非線形写像 g(\cdot)を求めて、この写像を用いて特徴 cを求める過程です。

 x=(x_1,...,x_D)^\mathrm{T} \mapsto c=g(x)=(g_1(x),...,g_{D_c}(x))^\mathrm{T}

 コーディング関数 g(\cdot)の求め方は、以下の5通りに分類できます。

  1. データがある確率分布からサンプリングされていると仮定して、その確率分布を推定する(4.2節)
  2. 複数の代表点を利用してデータを再構築することで推定する(4.3節)
  3. 特徴空間においてデータがなす多様体を、複数の代表点を用いて推定する(4.4節)
  4. データの類似度を表す関数を、特徴写像の線形内積として近似することで推定する(4.5節)
  5. 畳み込み演算のカーネルを判別的に学習することで推定する(第6章)

確率分布の推定によるコーディング

 データがある確率分布からサンプリングされていると仮定して、その確率分布を推定します。

具体的な手法:

代表点を用いた局所特徴の再構築によるコーディング

 選択した代表的な局所特徴 b_iを用いて、局所特徴 xをできる限り近似することを目指します。

 x=\sum_{i=1}^K c_i b_i

 このとき、再構築の係数 c=(c_1,...,c_K)^\mathrm{T}は、局所特徴 xのコーディング後の特徴と見なせます。局所特徴の再構築によるコーディングは、近似に向けた制約付き最適化問題として定式化され、制約項の設定や最適化方法の違いで多くの方法が提唱されています。

多様体学習を利用したコーディング

 訓練データから非線形関数 f(x)を学習する問題を考えます。時に過学習の問題が発生しますが、多様体の構造を利用することで「次元の呪い」を回避します。

特徴写像の線形内積で近似したカーネル関数によるコーディング

 高い画像分類性能を持つ「カーネル法」におけるカーネル関数を、特徴写像の線形内積で近似します。

 k(x,y)\approx\phi(x)^\mathrm{T}\phi(y)

 データ数が増えた時に計算が困難になるカーネル法の弱点を克服でき、この関数 \phi(x)をコーディング関数とすることで、特徴間の類似度を保つことができます。

判別的な学習で推定された畳み込み演算のカーネルを用いたコーディング

 第6章に記載されているとのこと。

プーリング

画像領域内に存在する複数のコーディング後の特徴ベクトルを1本のベクトルにまとめる操作

具体的な手法:

  • 平均値プーリング
    • 対象ベクトルの平均値を計算する
  • 最大値プーリング
    • ベクトルの各要素の最大値を計算する
メリット
  • 画像から得られる局所特徴の数が異なる場合も、同じ次元の特徴ベクトルを得られる
  • 画像領域内の局所特徴の位置情報を考慮しないので、位置不変な特徴を得られる
デメリット
  • 局所特徴の位置情報を認識性能の向上に活かせていない
    • 例:車では4つのタイヤと運転席は一定の空間的関係性を持つので、局所特徴の位置関係を画像特徴として盛り込めれば、分類性能の向上が期待できる

空間情報の活用(4.6節)

 この章では、空間情報を活用する方法として、以下の3つの方法を紹介しています。

  • 局所記述子のベクトルの要素に空間情報を加えて、局所記述子を拡張する
  • 局所記述子同士の自己相関行列を計算し、改めて局所記述子と見なす
  • 空間ピラミッド
    • プーリング後の特徴に空間情報を付与する

おわりに

 以上、第4章の要点をまとめました。今後具体的な手法の仕組みについて読み込んでいきます。

"「いいね!」増えるハッシュタグ、AIが提案、東大が新技術"という記事の補足

 以下のようなキャッチーな科学ニュースがありましたが、いかんせん「東大が新技術」だけでどの部局の誰が発表したかなど情報が欠落していたので、備忘録としての補足。

www.itmedia.co.jp

科学技術振興機構(JST)からのプレスリリース

www.jst.go.jp

研究者

山崎 俊彦(ヤマサキ トシヒコ)
東京大学 大学院情報理工学系研究科 電子情報学専攻 准教授
※ 所属する「相澤・山崎研究室」は、画像処理分野で著名です。

発表媒体

 研究成果は8月19日からオーストラリアのメルボルンで開催されるThe 26th International Joint Conference on Artifical Inteligence (IJCAI)で発表されるとのこと。タイトルは“FolkPopularityRank: Tag Recommendation for Enhancing Social Popularity using Text Tags in Content Sharing Services”で、Proceedingsはまだ公開されていない模様。邦題は(FolkPopularityRank: ソーシャル・ネットワーキング・サービスで人気度を向上させるタグ推薦)。

[追記 20170815]

【Python, Gensim】doc2vecで関連記事の見出しを抽出する試み

 今回は、過去2回の記事*1*2でも使った日経新聞ツイッター(@nikkei)の投稿文のデータセットを用いて、類似する見出しを抽出しようという話です。とある見出しと類似する見出し、つまり関連記事を取り出す試みになります。

doc2vec

 この問題に取り組むため、今回は「doc2vec」*3というモデルに着目しました。このモデルはニューラルネットワークで文書のベクトル表現を学習する枠組みで、文書分類など文の類似度を測定するためにも使われます。

 doc2vecの説明については、先行記事*4*5に譲ります。

実装

 実装には、PythonのGensimというライブラリを用いました。

ライブラリの導入

 先行記事*6を参考に、ライブラリを導入しました。

コード

 先行記事*7を参考に実装しました。

 最初に、ライブラリをインポートし、データセットを読み込みます。

from gensim.models.doc2vec import Doc2Vec
from gensim.models.doc2vec import TaggedDocument

# 空のリストを作成(学習データとなる各文書を格納)
training_docs = []

f = open(r'C:/output.txt')
lines = f.readlines() # 1行毎にファイル終端まで全て読む(改行文字も含まれる)
f.close()

次のような、見出しを分かち書きしたデータセットを1行ごと読み込んでいます。

f:id:upura:20170802174530p:plain

 続けて、doc2vecの学習を行います。

sent_id = 0

sentents = []
for line in lines:
    # 各文書を表すTaggedDocumentクラスのインスタンスを作成
    # words:文書に含まれる単語のリスト(単語の重複あり)
    # tags:文書の識別子(リストで指定.1つの文書に複数のタグを付与できる)
    sentents.append(line)
    sent = TaggedDocument(words=line, tags=['sent' + str(sent_id)])
    # 各TaggedDocumentをリストに格納
    training_docs.append(sent)
    sent_id += 1

# 学習実行(パラメータを調整可能)
# documents:学習データ(TaggedDocumentのリスト)
# min_count=1:最低1回出現した単語を学習に使用する
# 学習モデル=DBOW(デフォルトはdm=1:学習モデル=DM)
model = Doc2Vec(documents=training_docs, min_count=1, dm=1)

# 学習したモデルを保存
model.save(r'C:/doc2vec.model')
 
# 保存したモデルを読み込む場合
# model = Doc2Vec.load('doc2vec.model')
 
# ベクトル'sent1'を表示(型はnumpy.ndarray)
# print(model.docvecs['sent1'])

学習結果

 学習結果を調べるため、直近の10件の投稿について、それぞれ最も類似度が高い見出しを表示します。出力は「テスト用の見出し」「最も似ていると判定された見出し」「区切り線」の順になっています。

# 最近の10件とそれぞれ最も類似度が高い文書を表示
for i_line in range(10):
    most_similar = model.docvecs.most_similar('sent' + str(i_line), topn=1)
    print(sentents[i_line])
    print(lines[int(most_similar[0][0][4:])])
    print("----------------------")

出力結果

株,2,万,円,回復,、,膠着,相場,に,好,決算,の,風穴,

自民党,の,木村,太郎,衆院,議員,が,死去, ,10,月,に,補選,

----------------------
首相,、,大田,元,沖縄,知事,の,功績,たたえる, ,県民,葬,に,出席,

??,",揺れる,仮想,通貨, ,危う,さ,と,可能,性,",

----------------------
止まら,ぬ,「,脱,ガソリン,・,ディーゼル,車,」,ドミノ,

アジア,の,ライドシェア,市場,で,米,中,大手,の,陣取り,合戦,。,中国,の,配車,アプリ,最大手,、,滴滴,出,行,が,ソフトバンク,と,組み,東南アジア,最大手,の,グラブ,に,2,2,0,0,億,円,を,出資,し,ます,。,米,ウーバー,包囲,網,を,敷ける,か,。,?,アジア,で,ウー,バー,包囲,網,ソフトバンク,と,中国,滴滴, , ,:,

----------------------
ガソリン,3,週,連続,上昇, ,店頭,131,.,1,円,、,前週,比,0,.,2,円,高,

堀江,氏,V,B,、,宇宙,ロケット,29,日,打ち上げ, ,民間,単独,初,

----------------------
日経,平均,終値,、,3,日,ぶり,2,万,円,台,回復,

日経,平均,、,3,日,続落, ,終値,は,15,円,安,の,1,万,9883,円,

----------------------
日経,平均,終値,、,2,万,円,回復, ,4,日,ぶり,反発,

NY,原油,が,8,日,続伸, ,需給,改善,の,観測,で,、,金,は,3,日,続落,

----------------------
「,手のひら,返し,」,の,円,安, ,米,経済,へ,の,悲観,和らぐ,?,

日経,平均,、,3,日,ぶり,反落, ,終値,97,円,安,の,2,万,98,円,

----------------------
米,で,蓄電池,の,普及,加速, ,再生,エネ,と,合わせ,低,コスト,

醜聞,もみ消し,「,懇願,しろ,」, ,米,政権,が,キャスター,脅迫,か,

----------------------
日経,平均,、,上げ幅,を,縮小, ,国内,投資,家,が,売り,

日経,平均,続落,、,利上げ,の,先行き,警戒, ,東芝,が,大幅,安,

----------------------
日経,平均,、,午後,に,入り,伸び悩む, ,利益,確定,売り,で,

民,進,の,蓮,舫,代表,、,続投,表明, ,「,引き続き,最前線,で,」,

----------------------

 5、9個目辺りは似ている見出しが抽出されている気もしますが、なかなか上手くいっていない印象です。

今後の展望

 今後は、どの辺りに問題があるのか、改善の余地があるのか調べていきたいと思います。現在思い当たる可能性としては、以下のようなところです。

  1. データ数が足りない→新聞記事データベースのようなものから集める
  2. データの前処理不足
  3. 学習アルゴリズムやハイパーパラメータの調整不足

 上流過程の1から順に試していくのが良い気がしています。

rでテキストファイルの文を1行ずつ分かち書き

 今回は、前回の記事で作成したデータセットについて、分かち書きを実行します。分かち書きすることで、例えばword2vec*1など更なる分析に活用できます。

 前回に引き続き利用するRパッケージRMeCab*2には、RMeCabTextという関数が用意されています。

RMeCabTextは、引数に日本語テキストファイル(文字符号化はRの設定値に一致していなければならない)を二重引用符「"」で挟んで指定して、MeCabに渡し、その結果をリスト形式でそのまま返す関数。 各リストの要素は、10要素からなるベクトルである。*3

 しかし今回、全3047行のテキストファイルに対して実行すると、処理落ちしてしまいました。

res <- RMeCabText("C:/nikkei.txt")

f:id:upura:20170802175343p:plain

 テキストファイルから100行程度を抜粋して実行すると問題なく処理できたので、細かく処理して最後に結果を結合しても良かったのですが、せっかくなので1行ずつ分かち書きしていくスクリプトを書きました。

library(RMeCab)

f = file("C:/nikkei.txt","r")
out <- file("C:/output.txt", "w")

while (1){
  a = readLines(con=f, 1)
  if (length(a) <= 0){
    break
  }
  res = RMeCabC(a)
  writeLines(paste(res), out, sep=",")
  writeLines(paste(""), out, sep="\n")
}
close(out)

 入力ファイルと出力ファイルの中身は以下の通りです。

入力ファイルの中身

f:id:upura:20170802174754p:plain

出力ファイルの中身

f:id:upura:20170802174530p:plain

*1:Mikolov, Tomas; et al. "Efficient Estimation of Word Representations in Vector Space". arXiv:1301.3781 Freely accessible.

*2:石田基広 (2017) 『Rによるテキストマイニング入門第2版』森北出版(東京) 183頁

*3:RパッケージRMeCabで用意されている関数

日経新聞のツイッター(@nikkei)で出現頻度の高い単語を抽出してみた

 今回の記事では、自然言語処理の勉強として、日経新聞ツイッター(@nikkei)において出現頻度の高い単語を抽出します。

データセット

  • 日経新聞ツイッター(@nikkei)の投稿文
    • 期間:2017年6月7日~2017年7月26日
    • 当該期間の3200件の投稿から、RTを除いた3047件を利用

データ収集

 TwimMachine(http://www.twimemachine.com/)というウェブサービスを用いました。出力結果をコピー・アンド・ペーストしてcsv形式で保存しました。

データ前処理

 Excelで処理しました。

=LEFT(A1,FIND("https",A1)-1)

 具体的には、以下のように投稿文からURL部分以下を削除しました。

株2万円回復、膠着相場に好決算の風穴 https://t.co/MV6Pdh8klj Wed Jul 26 07:40:03 +0000 2017

株2万円回復、膠着相場に好決算の風穴

 最終的には、1行ごとに1投稿文を含むテキストファイル形式(nikkei.txt)で保存しました。

形態素解析

 今回は、RパッケージRMeCab*1を用いて解析しました。

パッケージの導入

 作者によるウェブサイト*2を参照しました。

利用する関数

 今回は、RMeCabFreq()関数*3を利用します。この関数は、指定されたテキストファイルを形態素解析して、その活用形を原形に変換した上で、その頻度を数えて、結果をデータフレームとして返します。

library(RMeCab)

result <- RMeCabFreq("C:/nikkei.txt")
# 多い順に並べ替え
result = result[order(-result$Freq),]
result

出力結果(上位を抜粋)

Term Info1 Info2 Freq
64 記号 読点 2302
63 記号 空白 2289
203 助詞 連体化 1932
147 助詞 格助詞 1079
142 助詞 格助詞 948
59 記号 括弧閉 868
53 記号 括弧開 843
139 助詞 格助詞 780
162 助詞 格助詞 633
167 助詞 係助詞 565
6823 名詞 接尾 535
62 記号 句点 481
208 助動詞 367
6403 名詞 固有名詞 355
6345 日経 名詞 固有名詞 348
2243 平均 名詞 サ変接続 332
329 する 動詞 自立 323
168 助詞 係助詞 311
217 ます 助動詞 272
6776 名詞 268

 句読点や空白などの記号、「の」「に」「で」などの助詞が上位に来ています。

一般名詞のみを抽出

 記号や助詞からは特徴が見い出しづらいので、一般名詞のみを抽出して棒グラフを出力したいと思います。以下では、頻度が50より多い単語のみを可視化しました。

result <- result[result[, 2] == "名詞" & result[, 3] == "一般" & result[, 4] > 50, ] 
k.col <- rainbow(nrow(result))
matplot(1:nrow(result), result[,4], type = "n", xlab="", ylab = "Frequancy")
for(i in 1:nrow(result)){
  matlines(i, result[i,4], type = "h", col = k.col[i],  lwd =5)
}
legend(8, max(result$Freq), legend = result$Term, col = k.col, lwd = 5)

f:id:upura:20170801152139p:plain
 日経新聞らしく「株」「終値」「企業」「高値」といった単語が上位に来ています。「首相」(安倍首相)や「トランプ」(トランプ大統領)からは、報道機関らしさを感じます。「履歴」は、日経新聞朝刊最終面に掲載されている連載読み物「私の履歴書*4が要因です。データセットの該当期間が2カ月弱だったので、50回程度登場したのだと推察されます。

1試合当たり得点・失点から見る浦和レッズ・ペトロヴィッチ監督の凄さ

 浦和レッズの監督を務めていたミハイロ ペトロヴィッチの解任が本日、発表されました*1

 細やかな不満はあるにせよ、5年半もの長きにわたり浦和レッズで魅力的なサッカーを展開してくれたことに深くお礼を申し上げます。

 今回の記事では、1試合当たり得点・失点から、ペトロヴィッチの凄さを改めて可視化してみます。

 データは「FootballGEIST」*2を参照しました。

 最初に特筆すべきは、ペトロヴィッチが歴代最多の試合数をこなしていること。それでいてなお、勝率でも上位に付けていることです。

f:id:upura:20170730123538p:plain

 そして以下が、監督ごとの1試合当たり得点・失点を可視化した図です。横軸の「Goal For per Game」が1試合ごとの得点、縦軸の「Goal Against per Game」が1試合ごとの失点を示しています。

f:id:upura:20170730123921p:plain

 斉藤和夫はJ2で迎えた2000年に就任し、序盤は好調だったものの中盤から終盤にかけ苦戦が続き3位に転落したタイミングで解任された監督です。ブッフバルトは浦和サポには説明不要かと思いますが、2004~2006年に指揮を取り、2006年には悲願のリーグ制覇へと導いた監督です。

 「黄金期」だったブッフバルト監督時代とまでは行きませんが、長期政権ながらブッフバルトに次ぐ成績を残したペトロヴィッチに、改めて感謝の意を表したいと思います。

[参考]可視化のコード(R)

data <- read.csv("C:\\urawa.csv", row.names = 1)
library(ggplot2)
library("ggrepel")

g <- ggplot(
  data,
  aes (
    x = data[,1],
    y = data[,2],
    colour = data[,3],
    label = rownames(data)
  )
)

g <- g +  geom_point(
  size = 3
)

g <- g + geom_text_repel()
g <- g + xlab("Goal For per Game")
g <- g + ylab("Goal Against per Game")

plot(g)