投稿

3月, 2019の投稿を表示しています

機械学習のための特徴量エンジニアリングを読んだので感想をまとめる

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 twitterで良さそうな評判を度々目にしていて、気になってはいるけどわざわざ買うほどいい本なのかな〜〜と思っていたところに「英語の原著ならただで読める」という情報を得て早速PDFをダウンロード。 <div class="separator" style="clear: both; text-align: center;"><a href="https://images-na.ssl-images-amazon.com/images/I/51kp-FCHJ2L._SX258_BO1,204,203,200_.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://images-na.ssl-images-amazon.com/images/I/51kp-FCHJ2L._SX258_BO1,204,203,200_.jpg" width="312" height="400" data-original-width="260" data-original-height="333" /></a></div> `feature engineering for machine learning pdf`とかググればでてきます。 洋書の技術書はよくただでPDFが落ちているのでダウンロードだけはいつもするのですが(PRMLとか)、ページ数が多いものばかりダウンロードしてきてしまうのでいつも読み切れません。 ですが、今回の「機械学習のための特徴量エンジニアリング」はページ数も200ページちょいと手頃で、なんとなく知っている内容が書かれているということもあり、「いっちょ頑張って読み

【論文紹介】 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 有名だからとりあえず読んでみたけど、有名だから解説記事もいっぱいあるので簡単にめもだけ。 ざっくりまとめです。 ## 単語の分散表現 BERTは単語の文脈を考慮した分散表現の獲得手法の一つとして提案された。 単語の分散表現を獲得する手法はホットなトピックで、word2vecやgloveなどからELMo,OpenAI GPTといったものまである。(さらにdeep以前からいろいろ研究されているらしい) 大きく分けて * feature based * fine tuning の二種類のアプローチがある。 といってもこれはもともと知っている概念で、 feature basedは獲得した表現を入力として使うだけ(固有のタスクを解くときにはここまでback propagationしない) elmoやword2vecなどはこっち。word2vecは文脈を考慮していないがelmoは考慮するという点がelmoの売りらしい。 fine tuningは事前学習したモデルを固有のタスクを解くための入力層にして、全体をさらに最適化する(fine tuningする)手法の総称。BERTはこっち。OpenAI GPTもこっち。 ## 関連手法との比較(ELMo,OpenAI GPT) 先に書いたようにfeature basedかfine tuningするかといった違いもあるけど、根本的なモデルの構成の違いについて。 <div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-NLpcQUz-dlg/XJ4et2Y1c_I/AAAAAAAAAh8/7euLoD0pZiwqeQulCmegMIkBXWzM2R-iQCLcBGAs/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25

【振り返り】2019年 1月~3月

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 久しぶりに振り返り記事を書きます。 1月の時点で、もっと言えば去年の年末に大学が終わったのですでに春休みに入っていました。 就活をしながら、余った時間をどうしようかな〜と考えて今年のお正月を迎えていたのを覚えています。(インフルエンザで寝込んでいましたが) 何の予定もなかった春休みの始まりで充実した長期休みになるか不安だったのですが、意外にも充実していたので良かったです。 もしかしたら過去最高に長い記事かもしれない。 * 就活を終えた * 研究開発インターン二つ目にチャレンジ * ポートフォリオを作った * 台湾にいってきた * AtCoderで水色になった ## 就活を終えた この冬、就活を終えて進路を決めました。 夏にインターンに参加したところです。 就活エントリを書く人もたくさんいて、自分もいろいろ参考にしたので自分の体験談などを書こうかと思ったのですが、あんまり就活らしい就活をできていた気がしないので、振り返り記事の中でさらっとまとめておくにとどめておこうと思います。 自分は研究室で機械学習の研究をする傍ら、企業で長期インターンシップとして機械学習の研究開発、web開発などやってきていて、とりあえず新卒ではデータサイエンスに関わる仕事を探して就活していました。 いつまでも機械学習が流行っているわけではないと思うので、いろいろできたほうがいいなという視点は今も変わらず持ち続けているのですが、機械学習、データサイエンスが下火になるという確信もまたないので、今やれる/やりたいことを勉強していきたいと思っています。 なので、データサイエンスをやれる職といいつつ、そのうちどの辺りの範囲に重きをおくかという点で熟慮する必要がありました。 データサイエンティストという言葉の定義のあいまいさ、広さは就活を進めるにあたりなんども痛感しました。 コンサルに近いもの、研究に近いもの、エンジニアリングが必要なもの、などなど。 自分はインターンシップなどを通して、エンジニアに近いものがいいなと感じるようになりました。研究チックな部分も好きですが、論文のみで実

ABC084 D - 2017-like Numberを解いた

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 復習記事です。 結局解けたけどTLE一回してしまったので、復習。 ## 問題 <a href="https://atcoder.jp/contests/abc084/tasks/abc084_d">問題</a> Nが素数で、(N+1)/2も素数であるN(=2017に似た数)の個数を求める問題。 クエリがQ個与えられる。 ある区間に入っている2017に似た数の個数を求めるクエリが投げられるので、これに答えていく ## 解法 まず、素数のリストを得る必要がある。 クエリの区間の最大(右端)は問題設定から$10^5$なので、$10^5$以下の素数のリストが得られればよい。 愚直に素数かを判定して素数ならリストにいれるというのでは遅いので、エラトステネスの篩を使う。 ```python def eratosthenes(n): """n以下の素数をエラトステネスの篩によって求める.リストをかえす""" prime = [] limit = math.sqrt(n) data = [i + 1 for i in range(1, n)] while True: p = data[0] if limit <= p: return prime + data prime.append(p) data = [e for e in data if e % p != 0] ``` これで素数のリストが得られる。 次に2017に似た数を列挙して個数を数える。判定は定義の通りやればいいけれど、うっかりすると計算量が多くなるので注意しないといけない。 というのは ```python primes=eratosthenes(10**5) like_2017=[p for p in primes if (p+1)//2 in primes

【論文紹介】xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 論文読みました記事です。 読みっぱなしだと忘れるので、メモがてら記事にしています。 今回はKDD 2018のxDeepFMを読みました。 Factorization Machines + Deep系統の新しめの研究です。 これまでこの系統でなされてきた研究の集大成のような雰囲気が漂っているので、ここから差分を出すのは難しそうな印象を持ちました。しばらくはでなさそう?? 以前に書いた FM+ Deepの記事の続きなので、それを踏まえて読んでいただけると嬉しいです。 Neural Factorization Machines for Sparse Predictive Analyticsの紹介 xDeepFMの論文のcontributionは * DCNを改良した * vector wiseに交互作用を表現するのがよい * implicitに高次の作用を表すだけではだめで、明示的に表現する必要がある * CINは、vector wiseかつ明示的に高次の交互作用を表現するコンポーネントとして提案 * CINを、低次の交互作用を扱うコンポーネントと高次の交互作用をimplicitに扱うものを組み合わせてxDeepFMを提案 盛りだくさんにすればいいのかって気持ちになるけど。 全部乗せって感じです。 自分用メモのような書き方になっているので、論文を合わせて読むとわかりやすいかもしれません(というよりこの記事だけではわからないかもしれない) ## Deep+FMの関連研究 * 特徴量エンジニアリングだるい * 交互作用の項分重みを作ると膨大になって死ぬ * training dataに出てこない組み合わせがくると汎化しない ので、FMが考えられた。 * FMは交互作用を考えているけど、2次までしか考えられていないという問題 があり、これを解決するためにいろんな方法が取られている DNNを使わない手法として * HOFM がある。 これだと高次の交互作用を考えられるけれど、 * あまり重要でない交互作用とかも使ったりしてしまいあまり良く

AtCoderで水色になりました

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 先日のABC121で、ようやく水色になりました。 <div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-glD5eB_KLkU/XIZlGxlQ3cI/AAAAAAAAAfw/68u-y8DmcKI1zFUeWKsMLa1qg75n1MBpQCLcBGAs/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2019-03-09%2B23.15.24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://3.bp.blogspot.com/-glD5eB_KLkU/XIZlGxlQ3cI/AAAAAAAAAfw/68u-y8DmcKI1zFUeWKsMLa1qg75n1MBpQCLcBGAs/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2019-03-09%2B23.15.24.png" width="320" height="209" data-original-width="722" data-origin

ABC27C:倍々ゲーム

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 ## 問題 $x=1$からスタートして、各プレイヤーが交互に$2x$か$2x+1$に変換する $N$を超えたら負け。 解説ACでした ## 木を書いて実験する こういう時に手が動かないのはだめだなあと反省 再帰的な感じで書くのかなと思ったんだけど、次負けないような手を打つぐらいしか戦略がわからず、どうシミュレートしていいかわからず。 今回の木はとても単純なので、Nが決まるとゲームが終了するノードとそれが誰の番なのかの候補がいくつか決まり、さらにそれらも単純なので最適戦略がすぐきまります。 例えば、 $N=10$だった場合、 ゲームの終了状態は、 ``` (6,t) : x=6の状態でtakahashiの手番 (7,t) (8,a) (9,a) (10,a) ``` となっています。(node,その時の手番) (tはtakahashi,aはaoki) この場合だとtakahashiは8,9,10のいずれかに数字を持っていければ勝ちなので常に数字を大きくする(つまり$2x+1$にする)のが最適戦略になります。 aokiさんはその逆で、6,7にすれば勝ちなので$2x$にし続けます。 一般には$N$の木の深さの偶奇によってこの戦略は変わります。 $N=5$の場合、終了状態は、 ``` (3,a) (4,t) (5,t) ``` となり、今度は逆にtakahashiは数字を小さくし、aokiは大きくするのが最適になります。 ## 実装 ```python N = int(input()) depth = 0 while 2**depth <= N: depth += 1 if depth % 2 == 0: def takahashi(x): return 2 * x def aoki(x): return 2 * x + 1 else: def takahashi(x): return 2 * x + 1 def aoki(x): return 2 * x x = 1 t_turn =

Azure+Kerasで環境構築

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 今回はじめてAzureでGPUサーバーを借りてKerasを使ったdeep learningをしたので、その環境構築についてのメモを記事にしたいと思います。 Azureだけでなく、クラウドサーバーを借りるの自体が初なのでいろいろと詰まったりしましたが勉強になりました。 ## やりたいこと * sshで入る * jupyter notebookをローカルからいじれる ## 立ち上げ 最初はよくわからず適当にググって出てきた仮想マシンを立ち上げて環境構築しようとしました。 まずポータルに移動し、virtual machinesの欄から追加を選択。 サイズのところから検索窓に「nv」といれて出てきたlinux(ubuntu) NV6というのを立ち上げました。 ## sshを使う 立ち上げの際に、パスワードを設定するところで代わりにsshを使用するように設定します。 `ssh-keygen -t rsa`でキーペアを作って、公開鍵の中身をコピーしてVM設定画面に貼り付けます。 [【Azure】Azureの仮想マシンにsshで接続する方法を徹底解説 | beyondDays](http://shimadays.com/2017/11/17/azureconnect/)には > 仮想マシンを作る際の公開キーに入力するのは、user名を除く(下記の例だとtest_user)部分 って書いてあるけど、確認してみたらどっちでもいけた。 ## IPアドレスとDNS [Azure の仮想マシンとIPアドレス – MSKK Cloud OS Tech Blog](https://blogs.technet.microsoft.com/mskk-cloudos/2016/04/06/azure-ip/) Azureでは静的なパブリックIPアドレスは有償らしい。 動的でもDNS名がつけられるからDNS名を設定してssh configに書いとけば良さそう。 他の人の設定見ても静的なパブリックIPアドレスにdns名つけているっぽいのでそれでやりました。 動的にしていると、

.ssh/configの書き方

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 基本的なことなので調べれば出てきますが、自分のためにメモ。 ## sshの基本 公開鍵、秘密鍵を自分で作成して、公開鍵をログインしたいサーバー側においておく。 Serverの管理者に公開鍵を渡すケースが多い(おいてくれる) GitHubだったりAzureやAWSで使うクラウドサーバーだと自分でおきますが。 鍵のペアは `ssh-keygen -t rsa` とする。 すると鍵の名前を聞かれるのでパスを入力する。(名前だけでなくpathを正しく入力する必要がある) 未入力だとid_rsa的な名前になる .pubが公開鍵で、拡張子が付いていないのが秘密鍵。 公開鍵を渡す時は.pubの方に書かれているテキストをコピペして送ればいい。 IPアドレスとユーザーが送られてくるはずなので、以下のようにしてログインする。 ``` ssh -i "秘密鍵のパス" "ユーザーの名前"@"IPアドレス" ``` DNS名がわかっている場合はIPアドレスの部分をDNS名に置き換えても良い。 ## configで楽する これでログインできるけど、毎回これを書くのは大変。 configに書いておけばこのサーバーにはこのユーザーでこの鍵を使ってログインする、というのを決めておける。 ```:config Host hoge HostName "IPアドレス" or "DNS" User "ユーザーの名前" IdentityFile ~/.ssh/"秘密鍵" ``` .ssh/configにこれを書いておけば `ssh hoge` でログインできるようになる。 <div class="separator" style="clear: both; text-align: center;display:none;"> <a href="https://