dockerなど色々な方法でWindows用のゲームをDebianから動かそうと時々試していたのですが、環境をそこそこ汚さずに動作できるようになりました。Steamflatpakはコンテナを利用したソフトウェア配布ツールです。同様のものにsnapがありますが、flatpakはデスクトップアプリ向けらしいです。flatpak自体はaptでインストールできます。Steamのインストール、実行は以下のようなコマンドで行います。以下の記事を参考にしました。Play(Proton)でWindowsゲームを遊ぶflatpakで入れた場合i386ランタイム等も一緒に入れてくれるので、add-architectureなどをする必要はありません。単純にSteamの設定でベータに参加しProtonを有効化するだけです。ゲームをインストール一般的なSteamの操作でWindows向けゲームをインストールします。初回はProtonのダウンロードとインストールが行われます。runtime等も必要な場合はゲームの初回起動時に行われます。mod等を入れるならここを直接いじることになるでしょう。flatpakでSteamを消してもここは残るので不要なら直接rmしましょう。追記(2019/9/10)flathubのリポジトリ追加コマンドを記載しました。生活knok今日から仕事なのでタイマーストップ。いう過程を経てひと段落ついたので、総括をしてみようと思います。いつから転職活動を行っていたか実のところ、3年ぐらい前(2015年頃)から転職活動を始めていました。思うような結果が出なかったのですが、2017年度になって早期退職制度の対象者となり、良い機会だったので応募し、受理されて無事円満退職となりました。一応、転職以外の道として単純に給与あるいはそれ以外の何かで収入を増やす手段も検討し、そういったことを当時の上長にも相談したりということは行いましたが、会社の給与体系から逸脱するようなことはできませんでした。どのような手段を用いたか先の退職エントリーをSNSで広める以外に、以下の手段を用いました。転職サイトの利用エージェントについて転職を考え始めた時期に、転職エージェントのほうから声がかかりました。いくつかのアドバイスを得ることができ、個人的には有用でした。職務経歴書の書き方は非常に参考になりました。転職ドラフトに登録し、何度かドラフトに参加しました。登録した理由は、たまたま見かけたPR記事が知人だったからです。いくつかの指名を得ることはできましたが、最終的にマッチングがうまくいかなかったかなあ、という感じです。一つ残念だったのは、「提示した年俸の最低90%を指名企業は提示する」というルールが守られていなかったことです。この点については運営に直接伝えてはいます。LinkedInかなり前からLinkedInのアカウントは持っていました。外資企業からの連絡はLinkedIn経由でそこそこありましたが、resumeを送ってその後音沙汰なし、ということも多かったです。SNSでの退職エントリー公開について自分が予想していたよりは大きな反響がありました。10社ぐらいはコンタクトがありました。それでもやはりマッチングには苦労し、最終的に今の会社に雇用されました。エントリーはblogで、発信は主にTwitterで行いましたが、連絡手段としてはFacebook経由が最も多く、次いでメール、Twitterという感じでした。転職活動をするにあたってFacebookアカウントはあったほうが良いのかなと思います。前職を辞めるにあたって早期退職制度の申請に関しては非常にスムーズでした。上司たちも「会社が用意した正当な手段であり行使は自由だ」といって下さり、実際に円満退社できたことには感謝しています。早期退職制度の一環として、転職コンサルティング会社の1年間分の提供があり、一応使ってはみました。私を担当したコンサルタントの方はあまり自分の関心のある分野には明るくなかったようでしたが、それでもいくつか見繕ってはくれました。私の職務経歴書を見たうえで「これぐらいの年収が適切だろう」というものを提示してくれたので、客観的な市場価値を知ることができた(そしてやはり前職の給与は安かった)のはよかったと思います。新しい職場について最初の方では軽く触れましたが、2018年4月16日付けでロボット投信株式会社に入社し、働いております。現状は主にR&Dを担当しており、自然言語処理を中心としています。なされており、それらの再現実験や、機械学習の実サービスへの応用の模索といったことを行っています。業務として参加しました。FLOSS活動にも理解が深く、7月~8月に開催されたDebConf18も業務扱いで参加させてもらうことができました。ロボット投信株式会社ではエンジニアも募集しています。Wantedlyに募集ページがありますが、私個人へのコンタクトも受け付けております。興味のある方がいらっしゃいましたらご一報ください。自由ソフトウェアknok自分の観測範囲で見かけたものをまとめてみます。ほかにFLOSS関連でこんなのがあった、という話があれば追加します。FoundationFSFがFacebookを買収するためにクラウドファンディングを始めた、というネタ。ところでFacebookはGnuPGに寄付をしています。practiceファシズムをDebianパッケージ化する提案です。過去にもrootkitのITPなど、エイプリルフールネタはありました。一度は書いてみたかったセリフなのですが、まだ確定ではありません。オリジナルは荒木飛呂彦作の「ジョジョの奇妙な冒険」第一部、ディオのセリフです。経歴について職務経歴書を公開します。対象者となったので、周囲に相談しつつ申請をしたという状況です。承認されれば今年度一杯をもって退職となります。一言でいえば「待遇に不満がある」のが理由です。調査会社による年齢ごとの年収調査によると、残業を含めた上での額面での現在の年収に対し、平均から-200、最低値と比較しても-100という状態です。残業に関しては正直なところ「生活残業」状態であり、限度いっぱい働いているような状況です。2年ほど前から私生活上どうしても収入が必要になってしまったのですが、貯蓄もできずぎりぎりの状態を続けています。一方で心身の健康上今の生活を継続するのも厳しい、このままで健康を取り戻すことはできそうにない、ということで申請の決意をしました。これまでの経験1990年台後半当初は名古屋で働いていました。当時はインターネットの商業展開が始まった時期で、基本的にDebianでサーバを立てたり、CGIベースでプログラムを組んだりといったことを行っていました。全文検索システムにfreeWAISやNamazuを使うこともありました。当時はFLOSS活動が業務と直結していて、この時代は業務時間内のコミットも自由にできていました。Projectは2000年問題に対して積極的な取り組みをしており、私自身も2000年をむかえる時にサーバーが無事年を越せるか現場待機していました。業務で日をまたいだことは、生涯を通してこの日だけです。仕事で徹夜などをしたことはありません。21世紀に入ったところで、東京へ転勤になりました。東京での仕事はこれまでとは大きく変わりました。当初は電子ペーパー上にレンダリングする組版システムの担当ということだったのですが、2年ほどしてまったく違うプロジェクトにかわり、それ以後半年から2年程度という短いスパンで大きく違うプロジェクトに回される、というサイクルを繰り返しています。ここ2年ぐらいは学生の頃よりたくさん論文を読んでいます。オープンアクセス万歳。現職の良いところ2000年代前半まではかなり自由にやらせてもらえました。Linux協会の活動も業務の一環として行っていましたし、FLOSS活動にも特に制限はありませんでした。会社も安定はしています。これまでに働いていて、赤字だった年度は1回だけでした。主力である印刷に関しては斜陽であり、いかに新しい事業に活路を見出すかというのは常に課題です。私が携わった範囲では、新しい技術に触れることができていました。これは個人的に環境として恵まれていたと思っています。全社的にそういう傾向があるわけではありません。基本的にはオールドファッションな社風です。労働環境も世間的に見ればかなりよい方でしょう。事業部によっては激務であるとは聞いています。その代わりに残業代はきちんと出ます。自己アピールソフトウェアについて、幅広い範囲を取り組んできました。半年から2年で内容が変わりながらもなんとか追いついてそれなりの成果を出すことができていたと自分では思っています。ProjectをはじめとするFLOSS活動です。アクティブでない年もありましたが、なんとか今も継続してやっています。最近ではuim回りでいろいろお手伝いをしています。hammあたりからアップグレードを重ねてきています。いい加減i386は厳しいなという状況で、amd64への移行をいずれどこかでやる必要があるなと感じつつ数年経過しています。機械学習knokここのところ、画像処理関連をやってみています。Networks)という技術を、なにかしら自分の趣味の範囲で利用できないかなあと試してみています。初期に提案されたDCGANは非常に衝撃的だったのですが、いかんせんハイパーパラメータのチューニングがシビアでした。collapseという現象を起こし、まったく意味不明な画像しか生成できなくなります。collapseを起こしにくい新しい手法が提案されています。Networkが複数種類のGANsを実装、公開しています。こちらを使って画像生成を試してみています。twitterただ、やはり少ない画像数でこれを行うことは難しいなあというのが実際やってみての感触です。GANsでは生成器と識別器、2つのネットワークを交互に学習します。生成器はある分布に従う潜在変数の存在を仮定し、そこからサンプリングした乱数から画像を生成します。識別器は、生成器が生成した画像群を負例、訓練用に用意した画像を正例としてそれらを正しく分類するようなネットワークです。生成器と識別器を交互に学習させることで、生成器は識別器の正例群が持つ画像の特徴を捉えた画像を生成できるようになる、というのがGANsの大まかな仕組みです。生成器と識別器はそれぞれ反対方向の目的関数に向かって最適化されるので、最終的にお互いの訓練誤差が均衡した状態が理想となります。正例の画像があまりに少ないと、識別器の損失(誤差)がかなり小さな値にとどまってしまい、生成器は正例の画像をほぼそのまま覚えてしまうようです。つまるところ、「十分な数のデータがないと特徴を正しく捉えられない」というある種当たり前の結論に至りました。人間だったら少ないサンプルからそれっぽいことが学習できるんですけどねえ...と思ったところでGANsの転移学習はできないのか、ということをこれを書きながら思いました。tuningすればもう少しマシな結果が出るのでは、という予想です。これは一度試して見る価値はあるかもしれませんね...そのモデルを学習させるためのデータをどうやって用意するか、という課題はありますけど。Debianknokunstableのuimを更新しました。bugを修正してあります。option前者の問題は、いくつかのパッケージ統合作業を行った時に、libuim-devのドキュメントをsymlinkに変えたことがトリガで発生した問題です。postinstで以下の処理を追加しました。これにより、symlinkが必要に応じて生成されます。uimバイナリパッケージに/var/lib/uimのみを所属させていたのがトリガです。–ignore-fail-on-non-empty”を呼び出して/var/lib/uimを削除しようとします。uimパッケージに所属しているのはディレクトリのみなので、ここで削除されてしまうというわけです。こちらの対処としては、/var/lib/uim/READMEを用意してディレクトリを空にしないという方向で解決しました。同様の処置をしているパッケージは他にもあるので、対処としては間違ってないと思います。機械学習knok以前このような記事を書きました。Classificationを実装した複数の単語から構成される文章を、Bag-of-Wordsと対応する単語分散ベクトルで表現し、特徴ベクトルの最大値のみを抽出する、という感じの手法です。これの実装を書いた時はまだあんまり機械学習のことがよくわかっていなく(今もよくわかっていませんが)、それでも実験的、感覚的に「この手法は特に単語が増えると精度でないだろうな」と思っていました。その後畳み込みネットワークベースの手法を試しています。他の人が書いたChainer実装は既にあったので、自分はそれの最上層をSPP-Netに置き換えただけのものを試しています。(解説記事)基本的に、こちらのほうが特徴量をより多く捉えているはず(層の数とか種類とかから類推)なので、きっと性能は高いと思います(未検証)。CNNと混同しやすい略称なのでこう記述します)は「自分も論文だけ見て実装することはできたので満足。手法としてはいまいちっぽいよね」という気分でいました。先日この記事が目に飛び込んできました。AIで2chに悪口書いてる人を特定してみた。ブログちょっと過大に扱われてしまったのではないかと思い、この記事を書いています。layer)の値を生のまま出しています。実際にはこれにソフトマックス関数をかませて0〜1の確率値に整えるべきなのですが、そこをちょっとさぼっています。ソフトマックス関数で計算される分類タスクの出力は、全ラベルそれぞれの確率の合計が1になるよう調整されます。CNNでは分散表現の実数をそのまま加算するため、全体としては大きな値になりがちでです。その辺りの正規化が皆無なので、おそらく文章が長くなるほどあやしい挙動を示すでしょう。分散表現獲得また、分散表現の獲得もあまりよろしくない作りになっていると思います。乱数を初期値とし、逆誤差伝搬で各文字の分散表現を獲得しています。十分なデータ量がないと、適切な分散表現は獲得できないと思います。代わりに、例えば一般的な表現が多数出現するデータ量の多いコーパス(Wikipediaの記事、新聞記事など)から、word2vec等で獲得した分散表現を初期値に設定してやる、といったことで性能が向上する可能性があります。今回のケースだとWikipediaよりも2chの各種書き込み、Twitterのツイートから分散表現を事前訓練したほうが良い気がしてきました。CIFAR10等誰もが入手できるデータセットは非常に限られた分類のデータしかありません。それらを識別するモデルを用意したとして、まったく関係ないデータを与えると、識別器は無理やり何かしらの値を出力します。運が良ければ何かしらの要素が似ているものへの確率が高く出ますが、最悪まったく関係ないラベルだと推論してしまいます。これを回避するために、たとえば雑多なデータをたくさん用意して「その他」ラベルを作るという解決方法がありますが、これも一筋縄ではいきません。今年2017年の人工知能学会でクックパッドが発表した論文に、この過大に取り組んだ話が掲載されています。いうタスクを設定しています。単純に2クラスに分けると全く関係ない画像が料理判定されるケースについて言及があります。彼らはあえてより多くのクラスに分類した時、そうで無い時で分類精度を評価しています。以下論文の引用になります。我々は料理クラスは単一クラスで非料理クラスは多クラス化したものを採用している.客観的な指標(F-measure)では料理、非料理それぞれ多クラス分類した方が精度は高かったが、サービスの特性上適合率(precision)よりも再現率(recall)が高い手法を採択したとのことです。分類対象がテキストであったとしても、同様の傾向が出るであろうことは予想されます(CNNベースなら画像と扱いとしては同じため)。つまるところ、分類クラスを増やすことで「そのクラス固有の特徴が分類器(の中間層)で獲得できる」ということであり、それを雑多に「その他」にまとめてしまうと特徴にバリエーションがありすぎて、かえってうまく特徴を捉えられないことが起きうるというわけです。問答無用でどちらかのクラスに分類されてしまう他クラスに分けることで精度を上げられるといったところです。はてなブックマークのコメント100文字(http://b.hatena.ne.jp/entry/344063592/comment/knok)では伝えきれないので、記事にしてみました。networksをRNNに適用する論文の紹介資料があります。このページから直接speakerdeckへのリンクにとぼうとすると404になってしまうので、このページの埋め込み資料を見てください。元論文は以下のようです。Networksブックマークコメントについてこんな感じで修正していったように記憶しています。RCNNの実装書いた本人です。2価分類はそれぞれの選択肢の確立が1になるような出力になるので、関係ない人物何人かも含めて訓練した方がもうちょっとマシな結果が出るかもしれませんRCNNの実装書いた本人です。2価分類はそれぞれの選択肢の確立が1になるような出力になるので、関係ない人物何人かも含めて訓練した方がもうちょっとマシな結果が出るかもしれません/多値分類でも合計は1RCNNの実装書いた本人です。機械学習knokちょっと前に「猫の線画を書くと自動着色できる」というWeb上のデモが話題になりました。[インターネットコム]他いろいろ著者は、このデモに関するデータセットをいくつか公開してくれていますが、この妙に話題になった「猫画像の変換」に必要なデータセットのみ配布をしていません。なんとか自分でも再現したいと思い、いろいろとトライしてようやく結果を出せそうなところまできました。データ収集まず猫画像の収集をやりました。最初はWikipediaからの取得を考えていたのですが、現在Wikipediaが用意しているダンプに画像ファイルは含まれておらず、そもそも画像に関してはWikipedia標準のライセンスであるとは限らないと公式に書かれていました。domain)ということなので、ここから画像を集めました。画像URLのリストをgithubで公開しています。https://github.com/knok/pixabay-cat-imagesデータ分類Pixabayの検索結果には実際には猫ではない画像も割と混じっているので、ChainerCVの事前学習モデルを使ってある程度自動分類してから、手動でpix2pixに使えそうな画像を選別しました。集めた画像には背景が含まれています。これを除去する作業を最初はgimpやAndroidアプリを使って手動でやっていたのですが、なかなか大変なので自動で行うアプローチを模索し、セマンティックセグメンテーションを用いておおよそ望みの結果が得られました。Qiita線画変換まだこの結果を手で調整するということまではやっていないのですが、これだけでもそこそこ行けそうなので、画像を線画に変換する処理をやりました。Qiitaここまでの内容を一通りQiitaに書いてきましたが、一番技術的には大したことのない(他もそんなに大したことないですが...)猫画像の前景抽出が一番多くいいねがついています。わかりやすい結果の出る内容だと耳目を集めやすいんだなあという感想を持ちました。今後あとは実際にpix2pixにデータを与えて訓練するだけです。近いうちに処理用のGPUを買う予定です。driver/libraryのお世話になろうと思っています。GPUなら1日あればいける程度にまで処理時間が短縮されますからね。満足ゆく結果が出れば、公開しようと思っています。Image(pix2pix)について一応論文は読みました。あるドメインの画像を別のドメインに変換する、ということを一般化して行うことを目的とした手法となっています。セマンティックセグメンテーション、白黒画像のカラー化、ゴッホ風などのスタイル変換といったいろんな処理は、従来それぞれタスクごとにネットワーク構造と目的関数を設計して学習を行う、ということがやられてきましたが、それを一つの同じ手法で行うなかなかすごい手法です。論文を読むと損失関数を勝手に学習する、という感じのことがabstructに書いてあるのですが、実際のところはEncoder-Decoderモデルで目的の入出力ペアがうまく出てくるよう、中間層をうまいこと学習してくれるという感じに読めました。Encoder-Decoderには同じ階層の中間層動詞を繋げるU-Netという構造を使っています。これによって高周波成分、画像の細部をうまく学習できるそうです。条件付きGANの一種であり、Discriminatorを用いた敵対的な学習も行っています。このおかげで、割と少ないデータ量でもそれなりの性能を出すことができるようです。DiscriminatorにはPatchGANで使われているテクニックを用いています。単純な1枚画像に対する真贋判定を行うのではなく、小さいブロック(TensorFlow実装では30×30)に区切った領域それぞれに対して判断を行うようにしています。これも高周波成分の学習に寄与しているようです。画像のドメイン間変換には他にも1対1でない画像群から相互変換を学習するCycleGANという手法もあります。1対1でないという点はある種の教師なし学習に近いものがあるのですが、実現には適切なデータセットの用意とハイパーパラメータの調整が必要なようで、結構大変そうです。Pixabayへの投稿Pixabayに大変お世話になったので、自分も少しは写真を投稿しようと思っています。スマホアプリを入れたら投稿が簡単だろうかと思っていたのですが、どうやらアプリは検索・閲覧専用のようでした。Debianknok最近自宅の光回線が非常に遅い状況だったので、改善を試みました。そのついでに、ローカルのキャッシュDNSサーバーをpdnsdからdnsmasqに変更しました。IPv6を導入し、DS-Liteの設定をしただけなのですが、ローカルのDNSキャッシュサーバーのフォワード先をIPv6にしたかったのです。それでいてなおかつ、/etc/hostsの内容もみてくれるものを、ということでdnsmasqにしました。apt-getでパッケージを入れて、/etc/dnsmasq.d/local.confというファイルを新規作成して、内容を以下のようにしました。resolv-file=/etc/dnsmasq.resolv.conflisten-address=192.168.xxx,y,127.0.0.1localhostとローカル側のIPでlistenするようにし、フォワード先の設定が書かれたファイルを記述しているだけです。v6も扱えるようになりました。dnsmasqだけしても他のdnsサーバーパッケージはremoveされないというところです。53を他のサーバーが掴んだままでdnsmasqが起動できない、という状態に陥りました。addressから接続できる状態を意地できるよう、ポリシールーティングを設定しています。DS-Liteだけだとv4で繋げるすべがないので...DS-Liteのおかげで、通信速度は17Mbps前後だったものが70Mbps程度でるようになりました。自由ソフトウェアknok先日、「www.gnu.orgの日本語訳について」のミーティングに参加してきました。最近のFSIJ月例会はMumbleを用いたリモート開催を増やしているので、リアルミーティングは久しぶりです。当日の配布資料はhttp://git.savannah.gnu.org/cgit/www-ja.git/tree/doc/meeting-2017-01.txtにあります。git://git.savannah.gnu.org/www-ja.git)も見てみてください。私はこの1年ろくな活動ができていなくて申し訳なかったのですが、以前から考えていた「www-jaをコーパスとして機械学習による翻訳モデルを構築する」という活動に手をつけ始めました。TensorFlowのseq2seqサンプルを若干修正してWMTの代わりに任意のテキストファイルを与えられるようにしたコードは以前作成した(https://github.com/knok/tf-seq2seq-mod)ので、あとはデータセットを作成するだけです。scriptを作ってみました。natto-pyで動きます。fo.write("\n")以下のような感じで実行しています。>残念ながら利用可能なGPUを持っていないので、CPU演算のみで処理しています。Theanoの2つだけで、TensorFlowや自分がよく使っているChainerは入っていません。このあたりはupstreamの更新も頻繁なので、あえてパッケージを使わなくともvirtualenv+pipで適時入れるほうが良い気もします。いえ、GPUを使って深層学習を行うということは、ほとんどの場合プロプライエタリなソフトウェアに依存することと等価なので、「gnu.orgの翻訳」ということに限ればむしろCPUのみでの処理の方が望ましいのかもしれません。自由なコンピューティング実際、ミーティング当日も自由なコンピューティング環境がより一層損なわれているという話がありました。gniibeさんはChromebookにLibrebootを苦労して入れているようです。自分もここ数日いろいろとひどい目にあいました。360で利用しているLiveアカウントとの関連付けをWindows自身のログインアカウントと紐付けないと利用できないのです。8以降、Microsoftは極力Liveアカウントでのログインをさせるよう誘導しているのですが、8.1(とおそらく8)でそれが強制されるというのは厳しく、利用を諦めました。10ではこの点は改善されているようで、SmartGlassを含むストアアプリはアプリ単位で個別に利用するLiveアカウントを設定したり、そもそもLiveアカウントの必要ないアプリは普通にローカルアカウントのまま利用できるようになっていました。10マシンでSmartGlassを利用しています。googleアカウントが必須に近い状態ですが、Windowsも同様の仕組みに倒しているわけで、自由からより通い方向に進んでいるなあと痛感しました。Projectのソフトウェアについていくつか名前が挙げられました。これは割と致命的な気がしたのですが、GCCは4以降独自パーサ(gniibeさんによると、そもそもC++が自由文脈文法でないため)を採用しているとのことなので、案外問題は少ないのかもしれません。メジャーな言語処理系でもbison(yacc)必須なものがぱっと浮かびませんし。ひとつはGNUbikだそうです。うーん、これは重要でもないですかね。