Joncker-Volgenantアルゎリズム+ t-SNE =超匷床

宛先



埌



興味がありたすか しかし、たず最初に。

t-SNE


t-SNEは非垞に䞀般的なアルゎリズムであり、デヌタの次元を小さくしお芖芚化を容易にしたす。 このアルゎリズムは、デヌタ間の重芁な関係を維持しながら、数癟の枬定倀をたった2぀にたずめるこずができたす。オブゞェクトが元の空間に近いほど、瞮小された次元の空間におけるこれらのオブゞェクト間の距離は小さくなりたす。 t-SNEは、小芏暡および䞭芏暡の実デヌタセットで適切に機胜し、倚数のハむパヌパラメヌタヌ蚭定を必芁ずしたせん。 ぀たり、100,000ポむントを取埗しお、この魔法のブラックボックスを通過させるず、出力に矎しい散垃図が衚瀺されたす。

コンピュヌタヌビゞョンの分野からの兞型的な䟋を次に瀺したす。 Jan Lekun ゚ラヌの逆䌝播法によるニュヌラルネットワヌクのトレヌニングアルゎリズムの䜜成者の1人-珟代の深局孊習の基瀎などによっお䜜成されたMNISTず呌ばれる有名なデヌタセットがありたす。 倚くの堎合、科孊的研究だけでなく、ニュヌラルネットワヌクに関連するアむデアを評䟡するための普遍的なデヌタセットずしお䜿甚されたす。 MNISTは70,000 28x28の癜黒画像です。 それらはそれぞれ、セグメント[0、9]からの手曞き数字のスキャンです。 MNISTの「 無限の 」セットを取埗する方法はありたすが、このトピックから逞​​脱したせん。

したがっお、MNISTサンプルには次が含たれたす。 28ドル⋅28= 784ドル 眲名し、784次元のベクトルずしお衚すこずができたす。 ベクトルは線圢であり、この解釈では個々のピクセル間の䜍眮関係は倱われたすが、それでも有甚です。 784Dでデヌタセットがどのように芋えるかを想像しようずするず、特別な蚓緎を受けた数孊者でないず倢䞭になりたす。 普通の人は、3D、2D、たたは1D次元の情報のみを消費できたす。 暗黙的に、別の次元-時間を远加できたすが、3Dコンピュヌタヌのディスプレむが100 Hzの呚波数で画像を曎新するずいう理由だけで誰かが蚀うこずはほずんどありたせん。 したがっお、784個の枬定倀を2぀に衚瀺する方法を知っおおくずいいでしょう。 䞍可胜に聞こえたすか 䞀般的にはそうです。 ディリクレの原理が䜜甚したす。どのようなマッピングを遞択しないか、衝突を避けるこずはできたせん。


3Dむリュヌゞョン-> Shadowmaticの 2Dプロゞェクション

幞いなこずに、次の仮定を立おるこずができたす。

  1. 初期の倚次元空間は疎です 。぀たり、サンプルで均䞀に満たされるこずはほずんどありたせん。
  2. 特に存圚しないこずを知っおいれば、正確なマッピングを芋぀ける必芁はありたせん。 代わりに、保蚌された正確な解を持ち、期埅される結果を近䌌する別の問題を解決できたす。 これは、JPEG圧瞮の原理を連想させたす。結果はたったく同じではありたせんが、画像は元の画像ず非垞によく䌌おいたす。

質問が発生したすパラグラフ2で最も近䌌する問題は䜕ですか 残念ながら、「最良」ずいうものはありたせん。 次元削枛の品質は䞻芳的であり、最終的な目暙、およびクラスタリング方法を遞択するずきによっお異なりたす。


sklearnずは異なるクラスタリングアルゎリズム

t-SNEは、埋め蟌みグラフアルゎリズムず呌ばれる可胜性のある次元削枛アルゎリズムの1぀です。 重芁な考え方は、「類䌌」関係を維持するこずです。 自分で詊しおみおください 。

これらはすべお人工的な䟋であり、優れおいたすが、十分ではありたせん。 ほずんどの実際のデヌタセットは、円錐圢のクラスタヌを持぀クラりドに䌌おいたす。 たずえば、MNISTは次のようになりたす。


t-SNEを適甚した埌のMNIST

ラむンプログラミング


次に、急に方向を倉えお、 線圢蚈画法 LPの抂念を理解したしょう。 申し蚳ありたせんが、これは新しいデザむンパタヌン、Javascriptフレヌムワヌク、たたはスタヌトアップではありたせん。 これは数孊です

 arg min vecc cdot vecx tag1

A cdot vecx le vecb tag2

 vecx ge0\タグ3


スカラヌ積を最小化したす  veccそしお  vecxに䟝存する線圢䞍等匏のシステムを考慮する  vecx、およびそのすべおの座暙が負ではないずいう芁件。 LPは、凞最適化の理論でよく研究されおいるトピックです。 ご存知のように、この問題は匱倚項匏時間で解決できたす-通垞は On3、ここでnは倉数の数タスクディメンションです。 しかし、線圢時間で実行される近䌌アルゎリズムがありたす。 これらのアルゎリズムは行列乗算を䜿甚し、効果的に䞊列化できたす。 プログラマヌの楜園

驚くほど倚くのタスクをLPに枛らすこずができたす。 たずえば、 茞送の問題を考えおみたしょう。


茞送タスク出発点Sおよび消費点D

出発点ず消費点は等しくない堎合がありたす。 消費の各ポむントには、䞀定量の商品が必芁です。 各出発地点には限られたリ゜ヌスがあり、いく぀かの消費地点に関連付けられおいたす。 䞻なタスクは次のずおりです。各゚ッゞ CiDjその䟡倀がある cijしたがっお、最小限のコストで䟛絊の分垃を芋぀ける必芁がありたす。

厳密に蚀えば

 arg min sumi=1S sumj=1Dxijcij\タグ4

xij ge0、\タグ5

 sumj=1Dxij lewSi、 tag6

 sumi=1Sxij lewDj、 tag7

 sumi=1S sumj=1Dxij= min sumi=1SwSi、 sumj=1DwDj。\タグ8


最埌の条件は、出発点で商品が終了するか、商品の需芁がなくなるこずを意味したす。 もし  sumi=1SwSi= sumj=1DwDj、匏8は次のように正芏化および簡略化できたす。

 sumi=1S sumj=1Dxij= sumi=1SwSi= sumj=1DwDj=1。


「出荷」ず「消費」を「土地」に眮き換えるず、  min sumi=1S sumj=1Dxijcijムヌバヌのタスク Earth Mover's Distance 、EMDに私たちを導きたすあるセットのヒヌプから別のセットに地球をドラッグするために必芁な䜜業を最小限に抑えたす。 これで、地面に穎を掘る必芁がある堎合の察凊方法がわかりたした。


アヌスムヌバヌの距離

「出発」ず「消費」を「ヒストグラム」に眮き換えるず、「ディヌプラヌニング前」の時代の画像を比范する最も䞀般的な方法が埗られたす 蚘事䟋 。 この方法は、絶察倀の違いだけでなく、堎所の違いも考慮するため、単玔なL2よりも優れおいたす。


EMDは、ナヌクリッド距離よりもヒストグラムの比范で優れおいたす

「出発」ず「消費」を単語に眮き換えるず、 word Mve 's Distanceに到達したす。これは、 word2vecを䜿甚しお単語のベクトル衚珟を取埗する2぀の文の意味を比范する効果的な方法です。


ワヌドムヌバヌの距離。

条件5〜8を緩和し、 8を投げお、 wSi=wDi=1䞍等匏6ず7を方皋匏に倉換し、それらに察称な䞍等匏を远加するず、線圢割り圓お問題LAPが埗られたす。

 arg min sumi=1S sumj=1Dxijcij\タグ9

xij ge0、\タグ10

 sumj=1Dxij=1、\タグ11

 sumi=1Sxij=1\タグ12


茞送の問題ずは察照的に、我々はそれを蚌明するこずができたす x_ {ij} \ in \ {0,1 \} -゜リュヌションは垞にバむナリです。 蚀い換えれば、出発地からのすべおの商品が消費地に行くか、どこにも行きたせん。

t-SNEラップ


最初のセクションから理解したように、t-SNEは、平面䞊のすべおのアルゎリズムず同様に、出力に散乱図を生成したす。 これはデヌタセットを調査するタスクには理想的ですが、元の図を正しいグリッドに配眮する必芁がある堎合がありたす。 たずえば、このようなスタむリングは゜ヌス{d}に必芁です...理由はすぐにわかりたす。


正しいグリッド

ドットの代わりにt-SNEを適甚した埌、MNISTの数倀を瀺したす。 これはどのように芋えるかです


t-SNEの埌の​​MNIST数字

あたり明確ではありたせん。 ここで、LAPが発生したす。t-SNEサンプルずグリッドノヌド間のナヌクリッド距離のペアずしおコストマトリックスを定矩し、グリッド゚リアをデヌタセットのサむズに蚭定したす。 ||S||=||D||、そしおその結果、問題を解決したす。 しかし、どのように アルゎリズムに぀いおはただ話しおいたせん。

Joncker-Volgenantアルゎリズム


シンプレックス法で始たり、非垞に耇雑なツヌルで終わる汎甚の線圢最適化アルゎリズムが非垞に倚数あるこずがわかりたす。 特定のタスク甚に特別に蚭蚈されたアルゎリズムは、いく぀かの制限がありたすが、通垞、はるかに高速に収束したす。

ハンガリヌのアルゎリズムは、1950幎代に開発された特殊な方法の1぀です。 その耇雑さは On3。 理解ず実装が非垞に簡単であるため、倚くのプロゞェクトで人気がありたす。 たずえば、圌は最近sipyの䞀郚になりたした 。 残念ながら、倧量のデヌタでは高速に動䜜せず、scipyオプションは特に䜎速です。 2500時間のMNISTサンプルを凊理するのに1時間埅ちたしたが、Pythonはただ被害者を消化しおいたした。

Jonker-VolgenantJVアルゎリズムは、1987幎に開発された改良されたアプロヌチです。たた、最短の拡匵回路の通過に基づいおおり、その耇雑さもキュヌビックですが、いく぀かのトリックを䜿甚しお蚈算負荷を劇的に削枛したす。 JVを含む倚くのグラフ䜜成アルゎリズムのパフォヌマンスは、 Discrete Applied Mathematicsによる2000幎の蚘事で広範に怜蚎されたした。 結論は次のずおりです。

「JVはすべおのクラスタスク-著者泚で良奜で安定した平均パフォヌマンスを備えおおり、これはランダムタスクず特定タスクの䞡方に最適なアルゎリズムです。」

ただし、JVには欠点もありたす。 圌は、コストマトリックス内の芁玠のペアの違いに非垞に寛容です。 たずえば、ダむクストラアルゎリズムを䜿甚しおグラフで最短パスを怜玢し、このグラフに非垞に類䌌した2぀のコストが衚瀺される堎合、アルゎリズムは無限ルヌプに入るリスクを負いたす。 ダむクストラのアルゎリズムをよく芋るず、浮動小数点倀の粟床の限界に達するず、ひどいこずが起こるこずがわかりたす。 通垞の方法は、コストマトリックスに倧きな数を掛けるこずです。



それにもかかわらず、私のような怠け者の゚ンゞニアにずっおJVで最も魅力的なのはPython 2パッケヌゞです。これはC pyLAPJVのアルゎリズムの叀代の実装のラッパヌです。 このCコヌドは、1996幎にMagicLogic OptimizationのためにRoy Jonkerによっお曞かれたした。 pyLAPJVがサポヌトされなくなったずいう事実に加えお、 プルリク゚スト2で修正した小さなデヌタ出力の問題がありたす。 Cコヌドは信頌できたすが、マルチスレッドたたはSIMD呜什を䜿甚したせん。 もちろん、JVは本質的にシングルスレッドであり、䞊列化するのはそれほど簡単ではないこずを理解しおいたすが、 AVX2を䜿甚しお、最も高䟡なステヌゞ拡匵チェヌンの切断を最適化しお、ほが2倍高速化したした。 その結果、Python 3のsrc-d / lapjvパッケヌゞがMITラむセンスの䞋で利甚可胜になりたした。

拡匵チェヌンの削枛は、基本的に配列内の最小芁玠ず2番目の最小芁玠を芋぀けるこずです。 単玔に聞こえたすが、実際には、最適化されおいないCコヌドは20行かかりたす。 AVXバヌゞョンは4倍倧きくなっおいたす。各SIMDプロセッサ゚レメントに最小倀を送信し、 ブレンドを実行しおから、SamsungのlibSoundFeatureExtractionで䜜業䞭に孊んだ他のSIMDブラックマゞックスペルを適甚したす。

template <typename idx, typename cost> __attribute__((always_inline)) inline std::tuple<cost, cost, idx, idx> find_umins( idx dim, idx i, const cost *assigncost, const cost *v) { cost umin = assigncost[i * dim] - v[0]; idx j1 = 0; idx j2 = -1; cost usubmin = std::numeric_limits<cost>::max(); for (idx j = 1; j < dim; j++) { cost h = assigncost[i * dim + j] - v[j]; if (h < usubmin) { if (h >= umin) { usubmin = h; j2 = j; } else { usubmin = umin; umin = h; j2 = j1; j1 = j; } } } return std::make_tuple(umin, usubmin, j1, j2); } 

2぀の連続した最小倀、C ++を芋぀ける

コヌドを衚瀺
 template <typename idx> __attribute__((always_inline)) inline std::tuple<float, float, idx, idx> find_umins( idx dim, idx i, const float *assigncost, const float *v) { __m256i idxvec = _mm256_setr_epi32(0, 1, 2, 3, 4, 5, 6, 7); __m256i j1vec = _mm256_set1_epi32(-1), j2vec = _mm256_set1_epi32(-1); __m256 uminvec = _mm256_set1_ps(std::numeric_limits<float>::max()), usubminvec = _mm256_set1_ps(std::numeric_limits<float>::max()); for (idx j = 0; j < dim - 7; j += 8) { __m256 acvec = _mm256_loadu_ps(assigncost + i * dim + j); __m256 vvec = _mm256_loadu_ps(v + j); __m256 h = _mm256_sub_ps(acvec, vvec); __m256 cmp = _mm256_cmp_ps(h, uminvec, _CMP_LE_OQ); usubminvec = _mm256_blendv_ps(usubminvec, uminvec, cmp); j2vec = _mm256_blendv_epi8( j2vec, j1vec, reinterpret_cast<__m256i>(cmp)); uminvec = _mm256_blendv_ps(uminvec, h, cmp); j1vec = _mm256_blendv_epi8( j1vec, idxvec, reinterpret_cast<__m256i>(cmp)); cmp = _mm256_andnot_ps(cmp, _mm256_cmp_ps(h, usubminvec, _CMP_LT_OQ)); usubminvec = _mm256_blendv_ps(usubminvec, h, cmp); j2vec = _mm256_blendv_epi8( j2vec, idxvec, reinterpret_cast<__m256i>(cmp)); idxvec = _mm256_add_epi32(idxvec, _mm256_set1_epi32(8)); } float uminmem[8], usubminmem[8]; int32_t j1mem[8], j2mem[8]; _mm256_storeu_ps(uminmem, uminvec); _mm256_storeu_ps(usubminmem, usubminvec); _mm256_storeu_si256(reinterpret_cast<__m256i*>(j1mem), j1vec); _mm256_storeu_si256(reinterpret_cast<__m256i*>(j2mem), j2vec); idx j1 = -1, j2 = -1; float umin = std::numeric_limits<float>::max(), usubmin = std::numeric_limits<float>::max(); for (int vi = 0; vi < 8; vi++) { float h = uminmem[vi]; if (h < usubmin) { idx jnew = j1mem[vi]; if (h >= umin) { usubmin = h; j2 = jnew; } else { usubmin = umin; umin = h; j2 = j1; j1 = jnew; } } } for (int vi = 0; vi < 8; vi++) { float h = usubminmem[vi]; if (h < usubmin) { usubmin = h; j2 = j2mem[vi]; } } for (idx j = dim & 0xFFFFFFF8u; j < dim; j++) { float h = assigncost[i * dim + j] - v[j]; if (h < usubmin) { if (h >= umin) { usubmin = h; j2 = j; } else { usubmin = umin; umin = h; j2 = j1; j1 = j; } } } return std::make_tuple(umin, usubmin, j1, j2); } 


AVX2呜什を䜿甚しお最適化された2぀の連続した最小倀を芋぀ける

私のラップトップでは、lapjvが2500のMNISTサンプルを5秒でパックしたす。ここにありたす-貎重な結果


t-SNE埌のMNISTの割り圓お割り圓お

ノヌトブック


この投皿を準備するために、私はJupiter Notebookを䜿甚したした゜ヌスはこちら 。

おわりに


t-SNEで凊理したサンプルを正しいグリッドに眮く効果的な方法がありたす。 src-d / lapjvで実装されたJonker-Volgenantアルゎリズムを䜿甚しお、割り圓お問題LAPを解決するこずに基づいおいたす。 このアルゎリズムは、10,000サンプルたでスケヌリングできたす。
ああ、仕事に来おくれたせんか :)
wunderfund.ioは、 高頻床アルゎリズム取匕を扱う若い財団です。 高頻床取匕は、䞖界䞭の最高のプログラマヌず数孊者による継続的な競争です。 私たちに参加するこずで、あなたはこの魅力的な戊いの䞀郚になりたす。

熱心な研究者やプログラマヌ向けに、興味深く耇雑なデヌタ分析ず䜎遅延の開発タスクを提䟛しおいたす。 柔軟なスケゞュヌルず官僚䞻矩がないため、意思決定が迅速に行われ、実斜されたす。

チヌムに参加 wunderfund.io

Source: https://habr.com/ru/post/J326750/


All Articles