Stimulator

機械学習とか好きな技術話とかエンジニア的な話とかを書く

DQN-chainerリポジトリを動かすだけ

- はじめに -

こんにちは. @vaaaaanquishです.
この記事はChainer Advent Calender 2015 11日目の記事です.

今回は滑り込みで, 特に何か新しい事をやった訳でもないですが,
一応記事にする事に意味があると思うので投稿しておきます.

今回はただこれを動かすだけです.

完全に備忘録みたいな感じです. ご了承下さい.
多分誰でもできると思います.


- Deep Q-Networkとは -

Ugo-Nama氏の記事は非常に分かりやすく, Deep Q-Networkに至るまでの研究遷移も書かれており, かなり参考になると思います. ここでは一応の概略のみ記述しておきます.

Deep Q-Networkは強化学習(Reinforcement Learning)の一種であるQ学習(Q-learning)に対して, ニューラルネットワーク(Neural Networks)を多層化したDeep Learningを適応したものです.

まずQ学習とは, 「ある状態 sに対する最も良い行動 aの組み合わせ」となるテーブル関数 Q^{*}(s, a)を求める手法です.  Q^{*}(s, a)を作成するため, 様々な状態のエピソードを試行し,  Q(s, a)を更新します.
 Q(s, a) Q^{*}(s, a)に近付ける際は, 以下の様な更新式を用います.

 {\displaystyle
Q(s, a) ← Q(s, a) + \alpha (r + \gamma \  \max_{a^{'}} Q^{'}(s, a)- Q(s, a))
}

 Q^{*}(s,a)は直接的には得られないので, テーブル関数を用いた Q^{'}(s, a)を用います.
 Q^{'}(s, a)は状態sにおいて行動 aをした次のステップでのQ値です.
また,  \gammaは強化信号の割引率,  \alphaは学習を収束させるための学習率となるパラーメタです.

次にDeep Learningに代表されるニューラルネットワークのような手法では, 最適化の際に勾配法を用いるのが一般的です. 教師データを入力し, パラメータ \thetaを持つ学習器の出力と教師の誤差 L_{\theta}を用いて, 以下のように更新していきます.


\theta ← \theta - \alpha \nabla_{\theta} L_{\theta}

誤差 Lをパラメータ \thetaについて微分し, 足し合わせる事で更新する一般的な式です.
ここで誤差 L_{\theta}に対して強化学習における Q(s, a)を適応した場合, 以下のようになります.


\theta ← \theta + \alpha ( r + \gamma \  \max_{a^{'}} Q^{'}(s, a)- Q(s, a) ) \nabla_{\theta} Q_{\theta}(s,a)

前述した通り強化学習では Q^{*}(s,a)を事前に得る事はできないため, 教師信号として Q^{'}(s, a)を使っている形です. ニューラルネットワーク等におけるback propagationの各層の更新式と見比べたりすると分かりやすいかもしれません.

Deep Learningには様々な手法がありますが, 関数近似手法として上記のように強化学習の枠組みに適応する事で, 複雑で高次元な問題設定に対応する事が可能になりつつあります.


- DQN-chainer実行環境をつくる -

私の環境

  • OS : Ubuntu Server 14.04 LTS (GUI欲しいのでXが入っています.)
  • GPU : NVIDIA Tesla K40 (ラボのマシンです.)
  • Driver : CUDA 6.5 (訳あって6.5なだけで7.0以降でも大丈夫だと思います.)
  • Python : 2.7.6

既にインストールされているものもありますが, できる限り書いていきます.

python, numpy, scipy

言わずと知れた言語と数値計算ライブラリです.
私はPythonUbuntuデフォルトのものを用いています. バージョンは2.7.6です.
numpy, scipyは今後の事を考えるとpipでインストールする方が良いかと思います.
私の環境は研究室の他のメンバーが既にapt-getで入れてますがそれでも大丈夫です.

sudo apt-get install python2.7
sudo apt-get install python-numpy
sudo apt-get install python-scipy

 

・chainer

Deep Learning等をサポートする機械学習ライブラリです. 言わずもがなです. いつも使っています.

入ってない人はpipを導入後, インストールします.

sudo -y apt-get install python-pip
pip install chainer

私は入ってるのでアップデートのオプション"-U"をつけて

pip install -U chainer 

でアップデートしておきます.

よくGPUを利用するためにchainer-cuda-depsを別途インストールするような記載がありますが,
chainer 1.5版以降にすれば別途インストールの必要ないようです.

(chainerを最新版にし, import chainer出来るかどうかテストしておくと良いです.
またCUDAにパスが通り, GPUを操作できるか確認しておきます.
今回動かすリポジトリGPUを用いているため, 少し書き換えないとSegmentation Fault等になります.)

・RL-Glue

強化学習で言う所のエージェントと環境を接続するパッケージです.
RL-Glue - Journal of Machine Learning Research
(http://www.jmlr.org/papers/volume10/tanner09a/tanner09a.pdf)

"強化学習の接着剤"との名前の通り, 実験設定, エージェントの行動, 問題環境の3つを用意する事で, それらを接続してくれるものです.
JavaC/C++をサポートしています.
初めて知ったんですが, 強化学習のベンチマークを行う際には多いらしく, めっちゃ便利そうです.

以下のページからダウンロードします.
RL-Glue Core Project - RL-Glue
https://sites.google.com/a/rl-community.org/rl-glue/Home/rl-glue

最初「.debがあるな」と思い, Ubuntuソフトウェアセンター経由で入れましたが, ソフトウェアセンターからだと実行時に上手く動作しなかったので, ファイルを落として来て自前でコンパイルしました.
(後述のALE実行時にALEが認識できず終了してしまう)
上記ページにあるRL-Glue 3.04 (.tar.gz)を用いました.

解凍したらRL-Glue/docs/内にTechnicalManual.pdfがあるのでそれに従います.
RL-Glueのディレクトリ内で

./configure
make
sudo make install

上手くいかなかった場合のアンインストールはManualを参照して下さい.

・PL-Glue Python codec

先ほどのRL-GlueをPythonで扱えるようにするものです.

以下のページからダウンロードします.
RL-Glue Python codec
https://sites.google.com/a/rl-community.org/rl-glue/Home/Extensions/python-codec

解凍するとディレクトリ直下にPythonCodec.pdfというマニュアルがあるので参考にします.

cd /path/to/codecs/Python
python setup.py install

 

・Aecade-Learning-Environment(ALE)

今回は強化学習における"環境"としてATARIのROMを動かします.
ALEは, エミュレータを基盤にし, ROMファイルをRL-Glueと接続するためのライブラリです.

このページからインストールしてもいいですが, RL-Glueの最新版との互換性から最新版を入れた方が良いと思います.
http://www.arcadelearningenvironment.org/

記事内ではALE v0.4.4を用いていますが, 私はv0.5.0を用いました.
gitリポジトリがあるのでcloneします.

git clone https://github.com/mgbellemare/Arcade-Learning-Environment.git

(※2015年に0.5.1が出たらしく上記コマンドだとそっちが入るみたいです。バージョン絡みでコアダンプするといった報告も受けてるので、そういう時はダウンロードページから0.5.0をzipでダウンロードして解凍すると上手く動く場合があるかもしれません。)

こちらは/doc/manual/内にmanual.pdfがあるので参考にします.

ALEをインストールする前に, 今回ALEでROMを動かすためにディスプレイ表示, 音声出力を行いたいのでSDL(Simple DirectMedia Layer)を用います. SDLをインストールしておきます. mixerは必要ないかもしれません.

sudo apt-get install libsdl1.2-dev
sudo apt-get install libsdl-image1.2-dev
sudo apt-get install libsdl-mixer1.2-dev

次にALE直下にあるMakefileを編集しておきます.
元からあるMakefilemacのものである場合があり, 編集用にmakefile.macmakefile.unixが用意されています.
元のMakefileは削除し, makefile.unixを編集します.
USE_SDL, USE_RLGLUEの2つの項目を以下のように編集し,Makefileとして保存しておきます.

USE_SDL := 1
USE_RLGLUE := 1

編集したらcmakeの後makeします.
cmakeが入ってない場合は

sudo apt-get install cmake

ALEディレクトリで以下を実行します.
make の -j の後の数値はコア数です.
自分のコア数はnprocコマンド辺りでよしなに確認します.

sudo cmake -DBUILD_EXAMPLES=ON
sudo make -j 4

ここで最新版を入れてない, 設定を行ってないと, 実行時に

RL-Glue interface unavailable. Please recompile with RL-Glue support.

のようなエラーが出ると思います. 多分バージョンよりMakefileの方を見なおした方が良いと思います.
SDLとRL-Glueを使う設定をしたか確認すると良いです.

DQN-chainer

ATARIのPong!に対してDQNを適応したリポジトリ, DQN-chainerを使用させて頂きます.
リポジトリ内にはRL-GlueからALEを使う問題設計ファイルとなるexperiment_ale.pyに加えて, DQNのnature実装, nips実装が入っています.
詳しくはリポジトリ内のreadme.txtを読むと良いと思います.
Agentは, 元論文にもあるようにConvolutional Neural Network(CNN)モデルを使っています.

git clone https://github.com/ugo-nama-kun/DQN-chainer.git

 

ATARI ROMs

ATARIのROMファイルを用意します.
私はここからダウンロードしました.
Atari 2600 VCS ROM Collection
http://www.atarimania.com/rom_collection_archive_atari_2600_roms.html

/ROMs/内に各ROMファイルがありますが, Pong!は,
「Video Olympics – Pong Sports (Paddle) (1977) (Atari, Joe Decuir – Sears) (CX2621 – 99806, 6-99806, 49-75104) ~.bin」
みたいになってるので, Pong.bin等に適宜変更しておくと良いかと思います.


- 実行 -

リポジトリ内のreadme.txtにもありますが4つのターミナルを用意します.
それぞれ以下を実行します.

rl_glue
python dqn_agent_nature.py
python experiment_ale.py
./[path to ale] -game_controller rlglue -use_starting_actions true -random_seed time -display_screen true -frame_skip 4 [path_to_roms/pong.bin]

真ん中2つは/DQN-chainer内です.
[path to ale]と[path_to_roms/pong.bin]はALEのディレクトリとROMのあるディレクトリに適宜変更します.
多分ALEのディレクトリの中(ALEのMakefileがある場所)にale実行ファイルがあると思うのでそこめがけてPath書きます.
romへのpathも指定するのでALEディレクトリ外からやった方が吉.

これで多分動くと思います.
画面が出て来て学習が始まると良いです.


- 動画 -

ちょっと12月が想像以上に忙しかったのでTwitter動画で勘弁して下さい.
以下はnature実装を130000stepくらい経過した後の動画です.

かなり勝ちます.


- おわりに -

以上です. 多分あとはchainer実装の部分をイジれば他のアルゴリズムやROMで遊べるようになると思います.

本当はその拡張の部分をメインに書くつもりでしたが, 内定者研修とかいう意味不明な文化に生活を圧迫され, とりあえず動かすまでという記事になった次第です.

ただ, Ugo-Nama氏のDQNの記事もコードも美しいのでかなり理解が進みました.
Advent Calendarをケツカッチンになんとか押し進める事が出来て良かったです.
ありがとうございました.

Deep Learning Advent Calendar 2015の方では, DQNを用いた物体認識タスクについてとそのchainer実装なんかの話を(できれば)したいと思ってますので, そちらの方もよろしくお願いします.

 

Windows 10 にJuliaしてSublimeTextする

Windows 10 64bitにプログラミング言語"Julia"を導入して、Sublime Text 2の環境を整える話。
Juliaは0.4.0です。

- はじめに -

前回の記事と大体やってる事は同じです。多分Windowsの7以降くらいならこれでできると思います。


- Juliaのインストール -

Julia公式のダウンロードページ(http://julialang.org/downloads/)からWindowsインストーラを選択。PCが64bitなので64bit版。

インストーラのexeファイルをダウンロードできたら起動してインストール。

デフォルトではC:\Users\user\AppData\Local\Julia-0.4.0に入るっぽいです。
今回はとりあえず例としてC:\直下にインストールします。(C:\Julia-0.4.0\)


f:id:vaaaaaanquish:20151107033834j:plain

インストールが終了したらそのフォルダに移動して、Juliaアイコンのショートカット、または/bin/のjulia.exeを起動します。起動してJuliaロゴが表示されれば良いです。


- PATHの設定 -

Sublime Textをどうしても使いたいので、まずPATHの設定を行います。

まずはWindows 10のコントロールパネルを開きます。
コントロールパネルを見つけるのが面倒なときは、Winメニューの"すべてのアプリ"に"検索"があるのでコントロールパネルを検索すると出てきます(便利そうだったのでスタート画面にピン留めしました)。

(2015年8月だとWinメニュー出した所でキーボード押すと検索できるっぽいので不要)

あとは他の言語同様、
システムとセキュリティ > システム > (左タブ)システムの詳細設定 > 環境変数
です。

ユーザ環境変数とシステム環境変数のPATH(Path)にインストールした"C:\Julia-0.4.0\bin"を追加します。
PATHは;で区切るようになってます。
以下サンプルとして私のやつです。最後に付け足しただけです。

%PATH%;C:\Python27;C:\MinGW\bin;C:\Julia-0.4.0\bin

追加したら動作を確認するためにコマンドプロンプトを開きます。これも検索すると楽です。
コマンドプロンプトで"Julia"を入力しJuliaが起動すればハッピー。ダメそうならPATHを見直してください。


f:id:vaaaaaanquish:20151107035201j:plain


- Sublime Textの設定 -

前回の記事同様、Ctrl+bでビルドしたいので、[Tools]>[Bulid System]>[New Build System](日本語だと[ツール]>[ビルドシステム]から[ビルドシステムの追加])を選択。よしなに設定を書いて適当な名前で保存します。

{
    "cmd": ["julia", "$file"],
    "selector": "source.julia"
}

ここで1回Sublime Textを再起動して設定を読み込ませた方がいいかもしれません。


- テスト -

好きな場所にprintlnだけ書いたtest.jlみたいなファイルを作ります。

println("Hello, World!")

Ctrl+bを押して結果が帰ってこれば成功です。

f:id:vaaaaaanquish:20151107035830j:plain


- おわりに -

私はPackage Installerを導入し、いつものCtr+Shift+PでInstall Packageを選択。
"Julia"でサジェストされたものから"julia"と"JuliaCompletions"を入れました。
多分Sublime Text 2で2015年現在使えるのはこの2つっぽいです。
"julia"の方は前回の記事のJulia-sublime-packageのアレかなと思います。

なんかJuliaできて良かったです。
では、最高のJuliaライフを。

Janetterの他者紹介とRT後のツイート確認拡張プラグイン

- はじめに -

PC版Twitterクライアントで一番すきなJanetterのプラグインを公開する話

他者紹介とリツイート直後のツイートを表示するやつに飛ぶやつ


- 他者紹介 -

以前記事を書いたけど、共有方法をGithubに変更したので該当記事を削除して再掲載。

f:id:vaaaaaanquish:20140411102456j:plain

相手の名前を右クリックすれば他者紹介が簡単にできるだけ。
最早Twitterライフを送る上で(@ )を付けるのですら面倒なのである。

Githubにjsファイルを上げました:https://github.com/vaaaaanquish/introdon


- リツイート後のツイートを確認する -

@jz5がやってるWebサービスリツイート直後のツイートを表示するやつ

最近は変な巻き込みリプライも減ったし、非公式RTも伸びない限りない。
最早フォロワーですらリプライよりRT後の言及が多い。

Janetterから直接サービスに飛べればいいなと思ってこんな感じです。

f:id:vaaaaaanquish:20151006074008j:plain

query投げてるだけなので、本家サービスの仕様変更があったらまた対応すると思います。

Githubです:https://github.com/vaaaaanquish/rtnext


- おわりに -

なんか公開してるやつの紹介記事でした。

RT後を表示するやつに飛ぶやつですが、RTやFavの通知画面(ポップアップ)からはダメでした。

なんか適当にDMしたら公開してもいいよって言ってくれた@jz5さんにも感謝。

 

ホームページつくる日記

- はじめに -


vaaaaaanquish.hatenablog.com


こんな記事を書いたら, 時間も相まってはてブのホットエントリになったりした.

そしたらフォロワーやそれ以外の方からも



こんな指摘がめっちゃ飛んできて, 「このマシンだとこう見える」とか「こういう時はこうすると良いよ」とか「このサービス使うとええで」とか色々参考になるものが見えてきて, 結果三連休は作り直しばっかりやっていた.


- 面白かった -


ページを修正しつつjQueryや色んなCSSを読んでて思ったけど、Web周りってすごいセンスが必要だなと感じた. もちろんノウハウや経験も大事だけど, JavaScriptの絡ませ方が凄いコードとか, フレームワークの上手い使い方を見て「なるほどなあ」となった.

あと他の人が見る環境が多種多様すぎるって所も「グワーッ」ってなった. おそるべし.

これから

斬新でいい経験になった. iPhone, iPadWindows Phoneまで取り出して色々直したけど, センスのないガタガタの状態が続いている.

結論, bootstrapを早く抜け出したい.

なんかホームページを作った

- 7月10日(金) -

突然学部生の1人がゼミ終わりに

「ばんくしさんWebの知識あります!?」

から入って

「Webサイト作って勝負しませんか」

と言い出したのでその日にサーバとドメインを取った.

Webの知識はJavascriptを少し書いた事ある程度だったが何か始まった.

- 7月11日(土) -

Julia言語の勉強会に出てLTした.

懇親会ではJuliaの話も機械学習の話もできて良かった.

とても楽しかった.


- 7月12日(日) -

フォロワーと蕎麦を食べに言ってカラオケをして晩御飯はお酒を飲んだ.

とても楽しかった.


- 7月13日(月) -

月曜日は大学で実験のTAがある.

めちゃくちゃ大変だった.


- 7月14日(火) -

なんかPython書きたいしDjangoとかいうの使う事にした.


- 7月15日(水) -

午前から演習のTAと午後実験TAが被る最悪の日だった.

完全に厄日だった.


- 7月16日(木) -

台風が来るとの事だったのでおうちの片付けとかをした.

日曜日に仲の良いフォロワーが泊まりに来るとの事なのでトイレや風呂も掃除した.

綺麗な部屋はサイコー!


- 7月17日(金) -

研究室でゼミがあるので大学行った.

学部生のサイトを見せてもらうと既に広告が貼ってあってちょっと引いた.


- 7月18日(土) -

今、午前3時でなんかWebサイトができたので公開した.

http://vaaaaanquish.jp

PHPとかPythonDjango,bootstrapとjsとでなんか書いた.



- 今後の予定 -

何も公開してないGitとかにコンテンツが天から降ってきて欲しい.

後輩のWebサービスも許可してもらえたらいずれ紹介したい.

あと何か問題ありそうだったら言って欲しい感じのやつです.よろしくお願いします.

MacにJuliaしてSublimeTextする

OS X Yosemite 10.10.3にプログラミング言語"Julia"を導入して、Sublime Text 2の環境を整える話。

- はじめに -

Juliaは科学数値計算向けに開発されている言語です。
MatlabやR、Octave、numpy、scipyのような記述でかつ高速に処理を行えます。
http://julialang.orgにもあるように他言語に比べてとにかく早いです。めっちゃ早いです。

最近では、電脳戦の将棋AI等にも使われ、少しずつ認知度が上がってます。
私は機械学習を専攻していますが、Pythonで設計してJuliaで実験するのが日常になっています。

Juliaの構文以外で好きなところして

  • 早い > 嬉しいです
  • Juliaの中身がJuliaで書かれている > いざという時なんとかなります
  • Python連携 > Pythonのコードやライブラリを呼び出したり、Pythonからの移行が非常に楽です。

この辺が気に入って書いています。
後以下の記事とかを暇潰しに読んでいたところハマりました。


- Juliaのインストール -

参考:https://github.com/staticfloat/homebrew-julia/

Macにhomebrewをインストールしておいて

$ brew update
$ brew install gfortran
$ brew tap staticfloat/julia
$ brew install julia

起動した
f:id:vaaaaaanquish:20150519061826p:plain

- エラーと解決策 -

- brew update

brewのアップデートでエラーが出て

error: Your local changes to the following files would be overwritten by merge:
    Library/Formula/boost.rb
Please, commit your changes or stash them before you can merge.
error: Your local changes to the following files would be overwritten by merge:
    Library/Formula/boost-python.rb
    Library/Formula/gflags.rb
    Library/Formula/glog.rb
    Library/Formula/lmdb.rb
    Library/Formula/protobuf.rb
    Library/Formula/snappy.rb
    Library/Formula/szip.rb
Please, commit your changes or stash them before you can merge.
Aborting
Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master

この前機械学習ライブラリのCaffeを入れた時に書き換えたのでgit mergeできないと怒られた。
強制的に上書きして解決した。

$ cd $(brew --prefix)
$ git fetch origin
$ git reset --hard origin/master

これで行けるでしょって思ったら

error: Your local changes to the following files would be overwritten by merge:
    opencv.rb
Please, commit your changes or stash them before you can merge.
Aborting
Error: Failed to update tap: homebrew/science

scienceの中身も書き換わっていたので、/usr/local/Library/Taps/のscienceのバックアップを取ってからtap

$ cd /usr/local/Library/Taps/homebrew
$ mv homebrew-science/ homebrew-science-bak/
$ brew tap homebrew/science

brew update上手くいきました。

- install gfortran

あとgfortranのインストール時にもエラーが出た

Error: No available formula for gfortran 
GNU Fortran is now provided as part of GCC, and can be installed with:
  brew install gcc

gccの中に入ってるからgccインストールすれば良いとの事。gccは以前入れていたのでスルーした。
入っていなければエラー通り

$ brew install gcc

多分大丈夫。

- Sublime Textでbulid -

Command+bでビルドしたいので、[Tools]>[Bulid System]>[New Build System](日本語だと[ツール]>[ビルドシステム]から[ビルドシステムの追加])を選択。よしなに設定を書いた。

{
    "cmd": ["julia", "$file"],
    "selector": "source.julia"
}

 

- Packageのインストール -

Package Installerが導入されているなら、いつものCommand+Shift+PでInstall Packageを選択し

を入れると吉っぽい。

(他にもIJuliaのPackageもあったけどST3にしか対応してないので入れてない)

- テスト -

1linerのHello World(Fizzbuzz)
GitHub - vaaaaanquish/Julia_1liner_helloworld_fizzbuzz: show title

println([(x==0) ? "Hello, World!" : (x%3==0) && (x%5==0) ? "FizzBuzz" : (x%3==0) ? "Fizz" : (x%5==0) ? "Buzz" : x for x in 0:20])

 

- まとめ -

問題なく動いてハッピー。
Juliaにコード規約とかそれ関連のSTPackageとかできないかなと思う日々である。

LOGICOOL Bluetooth マルチデバイス キーボード ブラック k480をつかう

タイトル通りです。誕生日にびーきゃぷ(@beepcap)さんからもらったものです。

www.amazon.co.jp

レビューみたいな感じです。
ちなみに前の前のキーボードが壊れ、研究室のゴミ箱にあったキーボードを使っていた人が書いています。

見た目です。

f:id:vaaaaaanquish:20150321233658j:plain:w400

良いです。

ちょうど横になったiPad miniiPhoneが入ります。
端末を立てる所はゴムっぽい素材なので結構安定して立ちます。

キータッチも好きです。
少しキーが小さいですが、僕は指が大きくないので十分に感じます。
打鍵は可もなく不可もなくといった感じ。すぐ慣れました。
見た目は薄い感じですが、この見た目からすると打鍵感と音が強めだと思います。

見た目に反してそこそこの重量があるので安定して活動できます。

Bluetoothも良好です。
有線と無線どちらも使えれば最高でしたが、プログラミング等特に大きな不満なく活動出来ています。

端末切り替えも良い感じです。3つの端末を切り替える事ができて、WindowsLinuxOS XAndroidiOSで試して、切り替え時のペアリングは高速で良好、cmdやctrlもあり、長時間使っていないと自動で切断もしてくれます。

色んなマシンを使うので、このキーボードから手を離さず全ての動作が出来てとても快適になりました。L字デスクの端にあるMacbookに対してすらこのキーボードを使っています。


唯一の不満はキーボードが平面すぎる事でした。調整できません。

f:id:vaaaaaanquish:20150321233741j:plain:w400

少し斜めになってるのが好きなんですよね。
でもよくデスクを見渡して見ると、目の前にKORGシンセサイザーの名器「X50」がありました。

f:id:vaaaaaanquish:20150321233720j:plain:w400

この隙間に・・・

f:id:vaaaaaanquish:20150321233710j:plain:w400

ピッタリ!!

最高の角度になりました。

今ではこれ一つで活動しています。
外出時にも良さそうで、iPadとこれだけ持って出て軽いコーディングぐらいならできるなあとか思っています。



かなり気に入ってるので記事にしました。
キー配列や端末数を考慮したハイエンドモデルが色々出たら俺は買うぞって感じでした。

ありがとうbeepcap!ありがとうLogicool


(マウスも似たようなマルチデバイスで使えるやつあると良いなあ・・・)