Rangerの最適化アルゴリズムの解説

  目次 1 Ranger最適化アルゴリズムの概要 1.1 Ranger最適化アルゴリズムとは 2. 実験 2.1 データロード 2.2 データ前処理 2.3 Ranger最適化アルゴリズムのモデル作成 2.4 Adam最適化アルゴリズムのモデル作成 2.5 まとめ   記事:最適化アルゴリズムのまとめ   1 Ranger最適化アルゴリズムの概要 1.1 Ranger最適化アルゴリズムとは Ranger最適化アルゴリズムとは、LookaheadとRADamの統合です。 Lookaheadという名前のとおり,過去の勾配を使うのではなく,先を見据えた更新則を導入しています。具体的には,通常のoptimizer (SGDやAdamなど) によって重みパラメータを更新します。これらのパラメータを “fast weights” を呼びます。これらの “fast weights” を参考に、”slow weights”と呼ばれる,実際に評価に用いる重みパラメータを更新します。 つまり、これまでのoptimizerは”fast weights”の更新で終わっていましたが、Lookahead optimizerはこの更新を参考にした上で本当のパラメータ (slow weights) を更新するというわけです。 Rectified Adam、またはRAdamは、適応学習率の分散を修正するための項を導入するAdam確率オプティマイザーの変形です。 それは、Adam最適化で悪かった収束問題を高速化しています。 論文:Lookahead Optimizer: k steps forward, 1 step back https://arxiv.org/abs/1907.08610v1 論文:RAdam …

Rangerの最適化アルゴリズムの解説 Read More »

Networkxのネットワーク類似度

  目次 1. NetworkXの概要 2. NetworkXの類似性の測定 3. 実験 ・NetworkX環境設定 ・共通部分のノードとエッジの可視化 ・Jaccard係数の集合の類似度 ・graph_edit_distance ・optimal_edit_paths ・optimize_graph_edit_distance ・simrank_similarity 1. NetworkXの概要 NetworkXは、グラフ/ネットワークの作成、加工、構造分析をのPythonのパッケージです。そもそも、数学者、物理学者、生物学者、コンピューター科学者、社会科学者などの分野で活用されています。ソーシャル ネットワーク、分子グラフ、通信ネットワーク、物流ネットワーク、エネルギーネットワークなどの分析を対応します。 このライブラリは多くの機能があり、今回はネットワーク類似度を解説します。   2. NetworkXの類似性の測定(編集距離) グラフ編集距離は、2つのグラフを同形にするために必要なエッジ/ノードの変更の数です。 デフォルトのアルゴリズムは、正確な値ではなく近似値を用いています。 理由は、正確なグラフ編集距離(Graph Edit Distance – GED)における計算の問題は、多くの場合時間がかかります。 グラフ編集距離の例 四角のグラフは三角のグラフに編集は以下の図のような4つステップです。この時は、距離4です。 NetworkXのsimilarityのモジュール: graph_edit_distance(G1, G2[, node_match, …]) グラフG1とG2の間のGED(グラフ編集距離)を返します。 optimal_edit_paths(G1, G2[, node_match, …]) G1をG2に変換するすべての最小コストの編集パスを返します。 optimize_graph_edit_distance(G1, G2[, …]) グラフG1とG2の間のGED(グラフ編集距離)の連続近似を返します。 optimize_edit_paths(G1, G2[, node_match, …]) GED (graph edit distance) …

Networkxのネットワーク類似度 Read More »

pandas tips データフレームのループを倍高速化する

  目次 Pandasのデータ処理の概要 Pandasのループ処理改善 一般的なループ(Loop) iterrows() apply() Pandas ベクトル化(Pandas Vectorization) Numpy ベクトル化(Numpy Vectorization) Pandasのループ処理改善の比較   Pandasのデータ処理の概要 pandasで大量データを扱う場合、処理速度が遅く困る事があります。公式ドキュメントではパフォーマンス向上のために Cython や Numba を使う方法を記載しています。今回の記事はデータフレームのループを倍高速化する方法を解説と実験したいと思います。 最初はベンチマークとして一般的ループを実行します。   Pandasのループ処理改善 実験の環境: 環境:Colab(Webブラウザからプログラミング言語Python) データセット:2019年シーズンのサッカープレミアリーグの試合データ データ処理:特定のチームの試合が引き分けかどうか新しい列作成 評価:データ処理の速さ   data.worldからデータを読み込みます。 サッカーの結果かなら、特定のチームの試合で引き分けかどうか計算します。 import pandas as pd df = pd.read_csv(‘https://query.data.world/s/dz7yh6j26rhswrdlbx23eyebqpisvn’) team = ‘Tottenham’ df   1. Ilocを用いた一般的なループ(Loop) ループを使用する場合は、オブジェクト全体を反復処理します。 Pythonはメリットをいかせず非常に遅いです。 def soc_loop(df, TEAM): df[‘Draws’] = 99999 for row in range(0, len(df)): if ((df[‘HomeTeam’].iloc[row] == TEAM) & (df[‘FTR’].iloc[row] == ‘D’)) | \ ((df[‘AwayTeam’].iloc[row] == TEAM) & (df[‘FTR’].iloc[row] == ‘D’)): df[‘Draws’].iloc[row] = ‘Draw’ elif ((df[‘HomeTeam’].iloc[row] == TEAM) & (df[‘FTR’].iloc[row] != ‘D’)) | \ ((df[‘AwayTeam’].iloc[row] == TEAM) & (df[‘FTR’].iloc[row] != ‘D’)): df[‘Draws’].iloc[row] = ‘No_Draw’ else: df[‘Draws’].iloc[row] = ‘No_Game’   DataFrameでプレミアリーグからすべての試合を確認する必要があり、if文の分岐で彼らがホームチームかアウェイチームかを確認する必要があります。Loopは86.5 ミリ秒かかりました。 …

pandas tips データフレームのループを倍高速化する Read More »

ハミングとMLIPNSの文字列の距離

目次 1. ハミング(Hamming) 1.1 ハミングとは 1.2 ハミングのコード例 2. MLIPNS距離 2.1 MLIPNSとは 2.2 MLIPNSのコード例   関連記事: Pythonでの文字列の距離や類似性 距離と類似度の解説   前回はPythonでの文字列の距離や類似性について解説しました。今回の記事はHammingとMLIPNSを解説したいと思います。   1. ハミング(Hamming) 1.1 ハミング距離とは ハミング距離はHamming distanceの英語略称で、等しい文字数を持つ二つの文字列の中で、対応する位置にある異なった文字の個数です。例えば、 「101」と「100」の距離は、1です。 「make」と「made」の距離は、1です。 「job」と「jab」の距離は、1です。 あくまでも異なるかどうかでしか見ないため意味合い等は見る事は当然できません。ただしデータの誤り検知のような確実に同じと思われるような所で使われます。   1.2 ハミングのコード例 TextDistanceのライブラリでハミング距離を計算します。 すべてのアルゴリズムには、いくつかの一般的な方法があります。 .distance(* sequences)-シーケンス間の距離を計算します。 .similarity(* sequences)-シーケンスの類似性を計算します。 .maximum(* sequences)-距離と類似性の可能な最大値。 distance + similarity == maximum .normalized_distance(* sequences)-シーケンス間の正規化された距離。 戻り値は0と1の間の浮動小数点数です。ここで、0は等しいことを意味し、1は完全に異なることを意味します。 .normalized_similarity(* sequences)-シーケンスの正規化された類似性。 戻り値は0と1の間の浮動小数点数です。ここで、0は完全に異なることを意味し、1は等しいことを意味します。   init引数: qval–シーケンスをqグラムに分割するためのq値。 …

ハミングとMLIPNSの文字列の距離 Read More »

AdaDeltaの最適化アルゴリズム

  目次 1. AdaDelta最適化アルゴリズムの概要 1.1 AdaDelta最適化アルゴリズムとは 1.2 AdaDelta関数 2. 実験 2.1 ライブラリインポート 2.2 データ読み込み 2.3 データ加工 2.4 AdaDeltaの最適化アルゴリズムを作成 2.3 Adamの最適化アルゴリズムを作成 2.5 まとめ   記事:最適化アルゴリズムのまとめ   1. AdaDelta最適化アルゴリズムの概要 1.1 AdaDelta最適化アルゴリズムとは   AdadeltaはAdagradの拡張版の最適化アルゴリズムです。 過去のすべての勾配を累積するのではなく、勾配更新の固定移動ウィンドウに基づいて、単調に減少する学習率を下げていくような最適化アルゴリズムです。複数の値を保持するのではないのでAdagradに比べるとメモリー効率も良いと言われています。   ADAGRADメソッドでは、分母はトレーニングの開始から始まる各反復からの二乗勾配を累積します。 各項が正であるため、この累積合計はトレーニング全体を通じて増加し続け、各次元の学習率を効果的に縮小します。 何度もイテレーションの繰り返した後、学習率は非常に小さくなります。   下記の計算式になります。注意点としてはステップ5で差分を取っています。これは、無次元かと呼ばれる操作で学習していきます。この無次元かと呼ばれる特徴を用いているため、他のステップでも学習率を設定しないアルゴリズムです。 論文:ADADELTA: An Adaptive Learning Rate Method https://arxiv.org/abs/1212.5701   1.2 AdaDelta関数   Tensorflow tf.keras.optimizers.Adadelta( learning_rate=0.001, rho=0.95, epsilon=1e-07, name=’Adadelta’, …

AdaDeltaの最適化アルゴリズム Read More »

SELUの活性化関数

  目次 1. SELU活性化関数の概要 1.1 SELU活性化関数とは 1.2 SELU定義 1.3 SELUの特徴 2. 実験 2.1 データロード 2.2 データ前処理 2.3 SELU活性化関数のモデル作成 2.4 RELU活性化関数のモデル作成 2.5 まとめ 記事:活性化関数のまとめ   1. SELU活性化関数の概要 1.1 SELU活性化関数とは SELUはScaled Exponential Linear Unitsの英略称で、活性化関数の一つです。 SELUは勾配消失問題(Vanishing Gradient)を対応できます。何故ならばSELUは「0」を基点として、入力値が0以下なら「0」~「-λα」の間の値を、0より上なら「入力値をλ倍した値」を返します。ReLUおよびELUの拡張版です。 論文:https://arxiv.org/pdf/1706.02515.pdf Tensorflow: https://www.tensorflow.org/api_docs/python/tf/nn/selu PyTorch: https://pytorch.org/docs/stable/generated/torch.nn.SELU.html   1.2 SELU定義 xが入力データで、f(x)が出力結果である。 x ≦ 0の場合は、f(x)=λ × α × (ex-1)となる x > 0の場合は、f(x)=λ × xとなる。 …

SELUの活性化関数 Read More »

Pythonでの文字列の距離や類似性

  目次 1.TextDistanceのライブラリ 2.文字列の距離や類似性のアルゴリズム 2.1 編集ベース(Edit based) 2.2 トークンベース(Token based) 2.3 順序ベース(Sequence based) 2.4 圧縮ベース(Compression based) 2.5 音声ベース(Phonetic based) 2.6 シンプルアルゴリズム(Simple algorithm)   前回は距離と類似度について解説しました。今回の記事は文字列の距離や類似性を解説したいと思います。文字列類似性アルゴリズムは、ドメインに分類できます。 記事:距離と類似度の解説 1.TextDistanceのライブラリ Pythonは文字列の距離を計算するTextDistanceのライブラリがあります。TextDistanceは多くのアルゴリズムによって2つ以上のシーケンス間の距離を比較するためのPythonライブラリです。 特徴: ・30以上のアルゴリズム ・純粋なPythonの実装 ・簡単な使い方 ・比較する3つ以上のシーケンス ・一部のアルゴリズムでは、1つのクラスに複数の実装があります。 ・最高速度のためのオプションのnumpyの使用法。   ライブラリのインストール !pip install textdistance 詳細:https://pypi.org/project/textdistance/   2.文字列の距離や類似性のアルゴリズム   2.1 編集ベース(Edit based) 編集ベースアルゴリズムは、ある文字列を別の文字列に変換するために必要な操作の数を計算しようとします。 操作の数が多いほど、2つの文字列間の類似性は低くなります。 この場合、文字列のすべてのインデックス文字に同等の重要性が与えられることに注意してください。   編集ベースアルゴリズムの一覧 Algorithm Class Functions Hamming Hamming hamming …

Pythonでの文字列の距離や類似性 Read More »

sktimeの時系列分類アルゴリズム

  目次 1.距離ベース(Distance-based) 2.間隔ベース(Interval-based) 3.辞書ベース(Dictionary-based) 4.頻度ベース(Frequency-based) 5.シェイプレットベース(Shapelet-based) 6.ハイブリッド(Hybrid)   一般的な分類アルゴリズムはデータの時間順序に含まれる情報を無視します。時系列分類アルゴリズムは、時系列分類の問題に対して表形式の分類器よりもパフォーマンスが優れている傾向があります。 sktimeには、時系列分類のための多くのアルゴリズムがあります。この記事は時系列分類アルゴリズムの5つのカテゴリを紹介します。   1.距離ベース(Distance-based ) これらの分類アルゴリズムは、距離メトリックを使用して分類します。   K-Nearest Neighbors (Dynamic Time Warping) 代表的なk最近傍(KNN)アルゴリズムは、ユークリッド距離メトリック(Euclidean distance) をdynamic time warping(DTW)メトリックに置き換えることにより、時系列に適合させることができます。DTWは、時間、速度、または長さが正確に一致しない可能性がある2つのシーケンス間の類似性を測定します。   メリット KNN+DTWは、シンプルでよい結果であり、ハイパーパラメータ調整を必要がありません。ベンチマークのベースアルゴリズムとしてよく利用します。   デメリット KNN+DTWは、計算に多くのスペースと時間を必要とします。 シリーズが特定のクラスに割り当てられた理由に関する限られた情報を提供します。 ノイズの多いデータはパフォーマンスが低下する可能性があります。   DTW(Dynamic Time Warping)動的時間伸縮法の記事 LINK   2.間隔ベース(Interval-based ) 時系列フォレスト分類(Time Series Forest Classifier) 時系列フォレスト(TSF)分類は、ランダムフォレスト分類器をシリーズデータに適合させます。下記のような計算を行います。 ランダムな開始位置とランダムな長さで、シリーズをランダムな間隔に分割します。 各区間から特徴量(平均、標準偏差、および勾配)を抽出します。 抽出された特徴量で決定木を学習します。 必要な数のツリーが構築し、学習時間が終わるまで、手順1〜3を繰り返します。 新しいデータは、モデルのすべての木の過半数の投票に従って分類されます。   メリット 実験的研究により、時系列フォレストは、動的なタイムワーピングを伴う最近傍などのベースラインよりも優れていることが示されています …

sktimeの時系列分類アルゴリズム Read More »

pythonでの画像データお互い変換

目次 画像データロード – IPythonで画像データを表示 OpenCV – cv型データを読み込み – cv型データを表示 – Matplotlibでcv型データを表示 – cv型データ→pil型の変換 – cv型データ→sk型の変換 Pillow – pil型データを読み込み – pil型データを表示 – io.BytesIOでpil型データを表示 – Matplotlibでpil型データを表示 – pil型データ→cv型の変換 skimage – sk型データを読み込み – sk型データを表示 – Matplotlibでsk型データを表示 – sk型データ→cv型の変換 – sk型データ→pil型の変換 Matplotlib – Matplotlib型データを読み込み – Matplotlib型データを表示 PythonはOpencv、Pillow、 scikit-image、Matplotlibなどの複数便利なライブラリがあります。各ライブラリはデータ型が違います。今回の記事は画像データお互い変換をまとめたいと思います。それぞれのライブラリで特徴があります。 実験の環境は google colabです。 画像データロード # 画像をロード import urllib import urllib.request img_src = “https://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Origami_cranes_on_match_heads.jpg/320px-Origami_cranes_on_match_heads.jpg” img_file = ‘image.jpg’ urllib.request.urlretrieve(img_src, img_file) (‘image.jpg’, …

pythonでの画像データお互い変換 Read More »

GELUの活性化関数の解説

  目次 1. GELU活性化関数の概要 1.1 GELU活性化関数とは 1.2 GELU定義 1.3 GELUの違い 2. 実験 2.1 データロード 2.2 データ前処理 2.3 GELU活性化関数のモデル作成 2.4 ReLU活性化関数のモデル作成 2.5 まとめ 活性化関数のまとめ   1.  GELU活性化関数の概要 1.1 GELU活性化関数とは GELU活性化関数は、Gaussian Error Linear Unit functionsの略称です。GELUはOpenAI GPTやBERTなどの有名なモデルで使われている活性化関数です。 GELUはReLU、ELU、PReLUなどのアクティベーションにより、シグモイドよりも高速で優れたニューラルネットワークの収束が可能になったと言われています。コツとしては、Dropoutに似た要素を入れている事です。Dropoutとは、いくつかのアクティベーションに0をランダムに乗算することにより、モデルを頑強します。   1.2 GELU定義 Geluは以下のように定義されます。 Computes gaussian error linear: approximateがFalse場合は、 approximateがTrue場合は、 論文:https://arxiv.org/abs/1606.08415   1.3 GELUの違い GELUとReLUとELUは非凸(non-convex)、非単調(non-monotonic)関数ですが、GELUは正の領域で線形ではなく、曲率があります。 GELUは単調増加ではありません。 GELUは確率的な要素を加味しています(Dropout)。 ライブラリ: Tensorflow/Keras https://www.tensorflow.org/addons/api_docs/python/tfa/activations/gelu#returns …

GELUの活性化関数の解説 Read More »