いっしきまさひこBLOG

AI・機械学習関連、Web制作関連、プログラミング関連、旅行記録などなど。一色政彦。

Google Cloud Day: Digital 2020 3日目(機械学習)聴講ノート

本稿は、下記イベントの3日目(機械学習)を視聴時に取った個人的なノートをほぼそのまま公開したレポート記事です。誤字誤植や勘違いがある可能性があるのでご了承ください。 ざっくり目を通すと、機械学習関連のセッションの概要が分かると思います。視聴する際の判断材料や、内容を思い出すためのご参考に。

  • Google Cloud Day: Digital 2020
  • 2020 年 6 月 9 日 (火) - 11 日 (木) ライブ配信
  • 2020 年 6 月 9 日 (火) - 30 日 (火) 開催
  • 2020 年 7 月 1 日 (水) - オンデマンド配信中

なお、3日目の6/11当日は人工知能学会全国大会と日程が被っており、ライブ参加はできなかったので、後日6/12にオンデマンド配信を視聴しました。あと18日間、6月30日まで視聴できます。2020/7/9現在、オンデマンド配信中です。

Cloud AI の紹介と最新情報

  • Google Cloud 吉川 隼人 氏
  • ノートはまとめましたが、ほぼ全部知っている情報でした。

1. Cloud AI プロダクトグループ

Google Cloud(GCP)のAI関連の構成図が提示されました。

f:id:misshiki:20200612163532p:plain
Cloud AI プロダクトの一覧

どんな人が使えるものかがざっくりと示されました。

f:id:misshiki:20200612163611p:plain
Cloud AI プロダクトを活用するための指針

2. Contact Center AI

コンタクトセンター用のソリューションです。Google Cloud Text-to-Speechなどが使えるらしいです。コンタクトセンターについては、自分にはちょっと遠い話題なので割愛します。

3. Cloud AutoML

Cloud AutoMLは、カスタムモデルを作成できる機能です。名前と違って、自動で機械学習を行ってくれる技術というわけでは必ずしもありません。次のような感じで使えます。

f:id:misshiki:20200612222528p:plain
Cloud AutoMLの活用イメージ

Cloud AutoMLには次のようなものがあります。

f:id:misshiki:20200612222549p:plain
Cloud AutoMLの機能一覧

ビジネスにとっても価値のあるデータは以下のようなものがあるそうです。構造化データや時系列データが大きな部分を占めています。

f:id:misshiki:20200612222606p:plain
ビジネス価値のあるデータ

そのうちの構造化データにAutoML Tableが使えると。自動的に特徴量を選択して、整形されていないデータを考慮してくれるなどのメリットがあります。

4. AI Platform

機械学習プロジェクトを効率的に本番環境に構築するためにAI Platformが使えます。具体的には次のようなフロー全体をAI Platformが支援します。

f:id:misshiki:20200612222623p:plain
機械学習のフロー

このあと、それぞれのプロダクトの機能紹介がありました。超要約すると、いろんな機能があって効率的になるよ~、ってことです。

5. AI Explanations

AIの中身はブラックボックスと言われていますよね。

f:id:misshiki:20200612222641p:plain
AIはブラックボックス?!

AI Explanationsで推論結果に「説明」を付加できます。

f:id:misshiki:20200612222702p:plain
説明を付加

TensorFlow Probability によるベイズモデリング入門

  • アクセンチュア株式会社 須山 敦志 氏
  • TFP(TensorFlow Probability)は名前だけ知っていましたが、ベイズモデリングの概要からTFPによる実践まで説明されていて良かったです。

0. ベイズモデリングとは?

  • 統計モデリングの一種で、データ解析を行う方法
  • 確率計算に基づいたモデリング手法
  • 予測を分布で表せるのが特徴(次の図を参照)

f:id:misshiki:20200612222724p:plain
ベイズモデルでできること

「機械学習とモデリングの違い=ツールボックスアプローチとモデリングアプローチの違い」が示されました。

f:id:misshiki:20200612222745p:plain
ツールボックスアプローチとモデリングアプローチの違い

2. TensorFlow Probability によるモデリングと計算

  • TFP(TensorFlow Probability)=TensorFlowをベースにした確率的プログラミング言語(PPL)

TFPでいろいろ効率的になります。より具体的にビフォーアフターが説明されました。

f:id:misshiki:20200612222801p:plain
TFP(TensorFlow Probability)

次に線形回帰で例が示されました。まず、TFPをインポートして散布図を描画。

f:id:misshiki:20200612222818p:plain
TFPの実践例1

各点にフィットする回帰直線の式を設計。

f:id:misshiki:20200612222833p:plain
TFPの実践例2

推論計算を実行。

f:id:misshiki:20200612222848p:plain
TFPの実践例3

結果を可視化。ベイズモデリングは予測を分布で表現するので多数の線が引かれたような図になります。

f:id:misshiki:20200612222904p:plain
TFPの実践例4

3. 解析事例

以下の事例が示されました。

  • 事例1: ガウス過程回帰モデルによる予測的指標管理
  • 事例2: 潜在変数モデルによるセンサーデータ解析

4. まとめ

f:id:misshiki:20200612222919p:plain
まとめ

Cloud AutoML で実践する業務システム構築と ML デザイン

  • Google 尾崎 隆 氏, Google 佐藤 一憲 氏
  • 内容的にはこれも基本的だったです。

1. Cloud AutoMLとは

ML開発を支える人材が少なく、その作業も複雑で大変です。そのハードルを下げるためにグーグルが提供するのがCloud AutoML。例えばAutoML Visionでは画像認識・物体検知のカスタムモデルが作れます。ここでデモが流れました。まずはデータをインポート。

f:id:misshiki:20200612223009p:plain
データをインポート

それからトレーニング。

f:id:misshiki:20200612223028p:plain
トレーニング

結果を確認してカスタムモデルは完成。

f:id:misshiki:20200612223043p:plain
結果を確認

あとはエクスポートして使います。ラズパイなどで画像認識するデバイスなども作れます。

f:id:misshiki:20200612223101p:plain
ラズパイを使った画像認識デバイス

AutoML Translation、AutoML Natural Languageなど他にもあります。

2. AutoML Tablesと業務システムへの適用

AutoML Tablesを使うと、構造化データ(表データ)のカスタムMLモデルを作成できます。前処理が簡単。最も良いモデルが自動的に選択されます。

f:id:misshiki:20200612223119p:plain
MLモデルカタログから自動選択

そのバックグラウンドは次のような仕組みになっているそうです。

f:id:misshiki:20200612223139p:plain
AutoML Tablesのバックグラウンド

3. AutoML TablesとMLデザイン

ここで登壇者が尾崎氏(渋谷駅前で働くデータサイエンティストとして有名な方ですね)に代わりました。機械学習の基本的なことが解説されていきます。わかりやすいです。例えば過学習について。

f:id:misshiki:20200612223153p:plain
過学習

過学習を避けるためには必要な交差検証の話。

f:id:misshiki:20200612223215p:plain
交差検証

これに対応する機能もAutoML Tablesには搭載されているとのことです。

f:id:misshiki:20200612223232p:plain
AutoML Tablesで交差検証

4. AutoML TablesでスケーラブルなML開発

以前は多くの人的リソースを使って開発していたものが、AutoML Tablesでより少人数で簡単にできるようになってきているそうです。

f:id:misshiki:20200612223247p:plain
AutoML Tablesを使えばチームは不要

GCP の言語・音声系機械学習 API を活用したサービス実装

  • ソースネクスト株式会社 川竹 一, Google Cloud 唐澤 匠

機械翻訳:Google Cloud Translation API

  • BasicとAdvancedがある
  • Advancedは用語集を使える

f:id:misshiki:20200709203913p:plain
Translation APIのBasicとAdvanced

  • AutoML Translation API: 文章の対を登録できる

音声認識:Google Cloud Speech to Text API

  • Speech to Text Adaptation(適応): Pharase、Boost、Classesがある

f:id:misshiki:20200709203929p:plain
Speech to Text Adaptation

自然言語処理:Google Cloud Natural Language API

  • エンティティ抽出、感情分析、構文解析、コンテンツ分類ができる

f:id:misshiki:20200709203941p:plain
Natural Language API

  • AutoML Natural Language API

ポケトークでの活用事例

  • 音声翻訳は3つのステップ

f:id:misshiki:20200709203955p:plain
音声認識→機械翻訳→音声合成

  • カメラ翻訳も3つのステップ

f:id:misshiki:20200709204012p:plain
文字認識→機械翻訳→AR

  • 会話レッスンも3つのステップ

f:id:misshiki:20200709204130p:plain
音声認識→チャットボット→音声合成

AI Platform で実現する ML Pipeline

  • 株式会社プレイド 春日 瑛, Google Cloud 脇阪 洋平

  • AI Platform: Training、Prediction、Notebooks、Pipelines

f:id:misshiki:20200709223253p:plain
AI Platform Training

f:id:misshiki:20200709223305p:plain
AI Platform Prediction

f:id:misshiki:20200709223318p:plain
AI Platform Pipelines

  • Kubeflow Pipelines: 機械学習パイプラインの作成・実行・管理、そしてモジュールの再利用
  • KARTEにおけるML Platforの実現(株式会社プレイド)
  • KARTE: CX(顧客体験)プラットフォーム、非常に大規模なデータ集積&分析基板

f:id:misshiki:20200709223339p:plain
KARTEでもAI Platform Pipelinesの活用内容(Human-in-the-loop型のソリューション)

  • ロイヤルカスタマー分類、需要予測、異常検知といった課題解決テンプレート

f:id:misshiki:20200709223354p:plain
課題解決解決テンプレートの内容例

  • インフラ基盤

f:id:misshiki:20200709223407p:plain
実際に構築したパイプライン

  • AI Platform Pipelinesをベースとしたパイプライン環境の統一:
    • パイプライン実行環境の統一による管理工数が約30%削減
    • パイプライン開発効率の向上
  • AI Platform Trainingによる学習環境のスケーラビリティ:
    • インスタンスコストを約50%も削減
    • 学習環境をHigh-Memory、GPUなど柔軟に選択可能に
    • インフラの管理工数も削減
  • GCPと他社製品を組み合わせたCI(継続的インテグレーション)/CD(継続的デプロイ)の実現:

    • デプロイにかかる工数を約20%削減 -安定的に最新版をデプロイ可能に
  • 質問:販売予測や需要予測での、BigQueryとAutoMLの使い分けは?

AI Platform を利用した「アスクル・シミュレータ」による物流シミュレーション

  • アスクル株式会社 小池 和弘
  • AI Platform自体の解説は少なめだったのでメモも少なめに...

現在取り組んでいること

  • 2014年ごろから、データ分析基盤「ASUKUL EARTH」をGCPで構築してきた

f:id:misshiki:20200709230242p:plain
ASUKUL EARTHの構成図

  • 2019年からは、さらに知財ライブラリ「アスクルシミュレーター」を(AI Platform の Notebooks と AI Hub を活用して)構築している

f:id:misshiki:20200709230256p:plain
アスクルシミュレーターの構成図

EC物流シミュレーション

  • 構造的な問題にはメタな視点が必要

f:id:misshiki:20200709230311p:plain
構造問題の解法

Kaggle で勝つ GCP の活用方法

  • アクサ生命株式会社 平松 雄司, Google Cloud 葛木 美紀

Cloud AI NotebooksでKaggle ワークフローをポワーアップ

  • Kaggle: 誰でも参加可能なデータサイエンスのコンペ
  • Kaggle ノートブック使用時の課題: 計算量の多いタスクスでは不便
  • そこで、AI Platform Notebooks(CAIP Notebooks)

f:id:misshiki:20200710152537p:plain
AI Platform Notebooksとは

  • KaggleコンペをAI Platform Notebooksを経由して強力なGCPで処理

f:id:misshiki:20200710152551p:plain
AI Platform Notebooksの仕組み

  • ここでデモがありました。分かりやすい
  • AI Platform Notebooks/Kaggle/Colabでプラットフォーム間の比較

f:id:misshiki:20200710152608p:plain
プラットフォーム間の比較

  • KaggleでAI Platform Notebooksを利用する際のTIPS

f:id:misshiki:20200710152622p:plain
TIPS(KaggleでAI Platform Notebooks)

KaggleにおけるGCP活用事例

  • 『Kaggleで勝つデータ分析の技術』の著者の一人
  • Kaggleの称号システム: Novice、Kaggler、Contributor、Expert、Master、Grand Master
  • GCPをKaggleで活用した事例紹介

f:id:misshiki:20200710152634p:plain
事例紹介(KaggleでGCP)

  • 事例1:貸し倒れの予測をするタスク。評価指標はAUC
  • 実務では計算量の大きい巨大モデルはナンセンスだが、Kaggleでは競争なのであり

f:id:misshiki:20200710152645p:plain
巨大なモデルを実行するためのスクリプト

事例1

  • ノーフリーランチ定理: 全てのデータやタスクにおいて、「常に」他よりも優れているルールなどは存在しないこと
  • よって、参加者はKaggleに参加するたびに、より良いモデルを探ることなる。試せるだけしらみつぶしに試すだけの計算リソースが必要
  • 特にエーブルデータのコンペで、計算量が大きくなりやすいパターンがある

f:id:misshiki:20200710152659p:plain
計算量が大きくなるケース

  • そういったときにGCPが役立つ。金額はおサイフに相談になるが、GCPなら細かく調整可能

f:id:misshiki:20200710152711p:plain
Google Computer EngineのVMインスタンスを利用したりBigQueryを利用したり

事例2

  • 最近だとモデルの推論時間に制限がある傾向がある。この事例では2時間以内だっため、より小さなモデルを作成
  • 一方でモデルの学習時間には制限はなかった
  • 学習時の計算量が大きい場合、その計算環境を「ローカル+GCE」で柔軟に構築する方法を提案

f:id:misshiki:20200710152723p:plain
ローカル+GCE

まとめ

  • ご利用は計画的に

f:id:misshiki:20200710152736p:plain
知人の例:金メダルを取ったがトータル40万円で奥さんからお叱りをうける

Google Colaboratory(Colab)でRカーネルのノートブックを超簡単に作成するには?

結論から先に

上記のリンクをクリックするだけで、RカーネルのColabノートブックを新規作成できます(※ノートブックがGoogleドライブに保存されます。ちなみに「create=false」としても新規作成されてしまいます)。ブックマークするか、ショートカットリンクを保存しておくのがお勧めです。

f:id:misshiki:20200603000300p:plain
[ランタイムのタイプを変更]ダイアログ

関連として、下記のリンクをクリックすると、新規作成せずにPythonカーネルのColabノートブックを一時作成できます(※ノートブックは保存されません)。Rカーネルで一時作成する方法は分からないです。

また、次のリンクをクリックで、Colabのノートブック選択ダイアログが開きます。

解説

Google Colabは、グーグルが独自にカスタマイズして提供しているJupyter Notebook環境(Googleドライブのアドオン)です。基本的には、Jupyter Notebook(やJupyterLab)と機能が共通的です。

Colabは、通常、Pythonを実行できる開発環境/ノートブックとなっています。その実行エンジン(ランタイム)は、カーネル(kernel)と呼ばれ、実はPython言語(バージョン2とバージョン3)以外にもR言語/Swift言語が最初からサポートされています。

そのことは、Pythonカーネル上で!jupyter kernelspec listというコマンドをコード実行すると確認できます。

f:id:misshiki:20200603000424p:plain
ColabのJupyterカーネル一覧

このうち、ir /usr/local/share/jupyter/kernels/irと書かれている部分ですね。

使い勝手はPythonカーネルと同じです。MarkdownテキストもRコードも自由自在に書けます。

f:id:misshiki:20200603002156p:plain
Colab(Rカーネル)の使い勝手

Google Colaboratory(Colab)でSwiftカーネルのノートブックを超簡単に作成するには?

結論を先に

上記のリンクをクリックするだけで、SwiftカーネルのColabノートブックを新規作成できます(※ノートブックがGoogleドライブに保存されます。ちなみに「create=false」としても新規作成されてしまいます)。

f:id:misshiki:20200602235810p:plain
[ランタイムのタイプを変更]ダイアログ

関連として、下記のリンクをクリックすると、新規作成せずにPythonカーネルのColabノートブックを一時作成できます(※ノートブックは保存されません)。Swiftカーネルで一時作成する方法は分からないです。

また、次のリンクをクリックで、Colabのノートブック選択ダイアログが開きます。

解説

Google Colabは、グーグルが独自にカスタマイズして提供しているJupyter Notebook環境(Googleドライブのアドオン)です。基本的には、Jupyter Notebook(やJupyterLab)と機能が共通的です。

Colabは、通常、Pythonを実行できる開発環境/ノートブックとなっています。その実行エンジンは、カーネル(kernel)と呼ばれ、実はPython言語(バージョン2とバージョン3)以外にもR言語/Swift言語が最初からサポートされています。

これは、Pythonカーネル上で!jupyter kernelspec listというコマンドをコード実行すると確認できます。

f:id:misshiki:20200602235906p:plain
ColabのJupyterカーネル一覧

このうち、swift /usr/local/share/jupyter/kernels/swiftと書かれている部分ですね。

使い勝手はPythonカーネルと同じです。MarkdownテキストもSwiftコードも自由自在に書けます。

f:id:misshiki:20200602235945p:plain
Colab(Swiftカーネル)の使い勝手

サクッと試せるTensorFlow/Kerasニューラルネットワークの最小コード(Minimal Code)

「とにかくコピペだけでサクッと動かせるニューラルネットワークのコードが欲しい」というときがあるのだけど、検索してもなかなか出てきません。そこで、とにかくコピペだけ試せる最小コードを作りました。TensorFlow/Keras版です。

# ライブラリのインポート
import tensorflow as tf
import tensorflow.keras.backend as K

# 入力データ
NUMBER_OF_DATA  = 64
INPUT_FEATURES  = 1000
HIDDEN_FEATURES = 100
OUTPUT_FEATURES = 10
x = tf.random.normal([NUMBER_OF_DATA, INPUT_FEATURES])
y = tf.random.normal([NUMBER_OF_DATA, OUTPUT_FEATURES])
#x.shape # TensorShape([64, 1000])
#y.shape # TensorShape([64, 10])

# モデルの定義
model = tf.keras.models.Sequential([
  tf.keras.layers.Dense(input_shape=(INPUT_FEATURES,), units=HIDDEN_FEATURES),
  tf.keras.layers.ReLU(),
  tf.keras.layers.Dense(OUTPUT_FEATURES)
])
#model.summary()

# ★選択肢1★ トレーニング(簡易版)
LEARNING_RATE = 0.03   # 学習率: 0.03
EPOCHS = 100           # エポック数: 100
LOSS = 'mean_squared_error'

model.compile(
  optimizer=tf.keras.optimizers.SGD(learning_rate=LEARNING_RATE), 
  loss=LOSS,
  metrics=['accuracy'])
model.fit(x, y, epochs=EPOCHS)

print('Finished Training')
#print(model.get_weights())

# # ★選択肢2★ トレーニング(カスタマイズ版)
# LEARNING_RATE = 0.03   # 学習率: 0.03
# EPOCHS = 100           # エポック数: 100
#
# criterion = tf.keras.losses.MeanSquaredError()
#
# optimizer = tf.keras.optimizers.SGD(
#   learning_rate=LEARNING_RATE)
#
# def train_step(train_X, train_y):
#   training = True
#   K.set_learning_phase(training)  # tf.keras内部にも伝える
#   with tf.GradientTape() as tape:
#     pred_y = model(train_X, training=training)
#     loss = criterion(pred_y, train_y)
#   gradient = tape.gradient(loss, model.trainable_weights)
#   optimizer.apply_gradients(zip(gradient, model.trainable_weights))
#   return loss.numpy()
#
# for i in range(EPOCHS):
#     loss_result = train_step(x, y)
#     print(i, ':', loss_result)
#
# print('Finished Training')
# #print(model.get_weights())

ちなみに試すときは、Colabスクラッチパッドが便利ですよ。

サクッと試せるPyTorchニューラルネットワークの最小コード(Minimal Code)

「とにかくコピペだけでサクッと動かせるニューラルネットワークのコードが欲しい」というときがあるのだけど、検索してもなかなか出てきません。そこで、とにかくコピペだけ試せる最小コードを作りました。PyTorch版です。

# ライブラリのインポート
import torch
import torch.nn as  nn
import torch.optim as optim

# 入力データ
NUMBER_OF_DATA  = 64
INPUT_FEATURES  = 1000
HIDDEN_FEATURES = 100
OUTPUT_FEATURES = 10
x = torch.randn(NUMBER_OF_DATA, INPUT_FEATURES)
y = torch.randn(NUMBER_OF_DATA, OUTPUT_FEATURES)
#x.size() # torch.Size([64, 1000])
#y.size() # torch.Size([64, 10])

# モデルの定義
model = nn.Sequential(
            nn.Linear(INPUT_FEATURES, HIDDEN_FEATURES),
            nn.ReLU(),
            nn.Linear(HIDDEN_FEATURES, OUTPUT_FEATURES))

# トレーニング
LEARNING_RATE = 0.03   # 学習率: 0.03
EPOCHS = 100           # エポック数: 100

criterion = nn.MSELoss()

optimizer = optim.SGD(
    model.parameters(),
    lr=LEARNING_RATE)

def train_step(train_X, train_y):
    model.train()
    pred_y = model(train_X)
    optimizer.zero_grad()
    loss = criterion(pred_y, train_y)
    loss.backward()
    optimizer.step()
    return loss.item()

for i in range(EPOCHS):
    loss_result = train_step(x, y)
    print(i, ':', loss_result)

print('Finished Training')
#print(model.state_dict())

ちなみに試すときは、Colabスクラッチパッドが便利ですよ。

はてブのタグを一括編集、タグ名や日付で一括削除するためのツール「HatebuTagManager」

2020年12月16日追記:気付いたらいっぱいブックマークがついていてうれしかったです。ありがとうございます。はてなブックマーク本家で「タグの一括編集機能」が復活しました。これで本ツールは御役御免ですね。ご利用していただいた方、ありがとうございました。 - 「タグの一括編集機能」をPCのブラウザで再提供いたします - はてなブックマーク開発ブログ

はてなブックマークの「タグ一括 編集(タグの 置換変更)」「タグ名による 一括 削除」「日付による 一括 削除」の3機能を提供するWindowsアプリです。簡単な操作で使えます。※非公開ブックマークにも対応しています!

f:id:misshiki:20200408142131p:plain
はてブのタグを編集(変更/置換)したり、削除したりできる!

※注意事項: 本ツールの使用によって、何が起こっても無補償です。作者は一切の責任を負いません。自己責任でお願いします。ご了承のうえで本ツールをご使用ください。もちろんツール作者自身も本ツールを使っていますので、そんな大変なトラブルは起きないとは思いますが。

目的

かつて「はてなブックマーク」ではタグの一括置換機能が提供されていましたが、あまり使われなかったためか、機能が廃止されてしまいました。そこで「タグ一括置換」を行うための簡単操作ツール(Windowsアプリ)を作りました。

さらに、指定タグ名が含まれるブックマークを一括削除したり、指定日より前のブックマークを一括削除したりするための機能も、このツールに搭載しました。

(ちなみに最初に作り始めたのは2019年7月でしたが、2020年4月に行ったタグ整理をきっかけに、全機能を完成させました。)

ユースケース(用途)

  • 例えば、ツールや製品などの名前が変わったために、タグの名前も変えたい → [タグ一括置換]
  • 例えば、一度つけた名前がしっくりこなくて、後悔している → [タグ一括置換]
  • 例えば、技術が廃れたり製品がなくなったりしたため、タグごとブックマークもなくしたい → [タグ名による一括削除]
  • 例えば、ジョブチェンジや趣味の変化などの理由で、(タグ一覧で存在感が大きすぎる)以前のタグの存在感を弱くしたい → [タグ名による一括削除]
  • 例えば、5年以上前のブックマークは見返すことはないので、直近数年を残してブックマーク全体をリセットしたい → [日付による一括削除]
  • 例えば、ブックマークが大量すぎて、全体が把握しづらいので、とにかく数を減らしてスリム化したい → [日付による一括削除]

以上のような用途が考えられます。こういった用途に合致するのならば、以下の事前準備と使い方の方法でぜひツール「HatebuTagManager」を使ってみてください。

事前準備

  • このツールは「はてなブックマーク REST API」を使っています。その認証方法は、OAuthのみとなっており、Consumer keyとSecretが必要です。
  • Consumer keyとSecretは、公式ページ「OAuth ではてなのサービスにアクセスする - はてな」で取得してください。
  • [新しいアプリケーションの追加]ボタンを押すだけです。次に表示される登録ページ内の[キー]欄に、Consumer KeyとSecretは記載されています。
  • 登録ページ内の[承認を求める操作]欄で、下記の4つにチェックを付けて、一番下の[変更する]ボタンを押せば完了です。
    • read_public …… 公開情報の読み取り
    • write_public …… 公開情報の読み取りと書き込み、削除
    • read_private …… プライベート情報を含む情報の読み取り
    • write_private …… プライベート情報を含む情報の読み取りと書き込み

「HatebuTagManager」の使い方

  • ツール「HatebuTagManager」の最新バージョンは、[Releases]から「HatebuTagManager.~.zip 」ファイルをダウンロードしてください。その.zipファイルを展開して、フォルダー内のHatebuTagManager.exeファイルを実行してください(Windows 10専用です)。

GUIツール画面

  • 上から順番に、各入力欄に適切な内容を入力し、ボタンを押していってください。
  • ※[……(テスト用)]と書かれているボタンは、指定URLのブックマークを1つだけ処理する用です。一括処理時は、このボタンを押す必要はありません。
  • 【 ステップ 2 】では、
    • 「公開」ブックマークのみの場合: [すべての「公開」ブックマーク情報の取得]ボタンをクリックしてください(手軽)。
    • 「公開&非公開」全ブックマークを取得したい場合: はてなブックマーク公式のエキスパートページ から、ブックマーク形式のデータファイルをダウンロードして、ツール上にドラッグ&ドロップしてください(お勧め)。詳しくは後述します。
  • 【 ステップ 3 】に、上記の3機能に対応するボタンがあります。
  • 【 ステップ 3 】の処理中に実行をどうしても止めたくなった場合は、右上の[×]ボタンをクリックしてください。
    • ※ただし、これは強制終了でアプリを閉じることになり、アプリが閉じられる直前に強制的に「途中まで実施済みの結果ログの出力」が実行されます。
  • 【 ステップ 3 】の3機能を実行した後で、続けて【 ステップ 3 】の3機能をさらに実行したい場合は、【 ステップ 2 】の[すべてのブックマーク情報の取得]ボタンを押して、全ブックマーク情報をリセットしてから行ってください。
    • ※最新のブックマーク情報を取得し直す必要があります。

「公開&非公開」全ブックマークを取得する方法

非公開のブックマークを含めて全ブックマークを取得するためのAPIは提供されていません。そのため、ユーザーの方で全ブックマークをエクスポートとして、それを本ツール「HatebuTagManager」にインポートする必要があります。インポート方法は、ドラッグ&ドロップのみサポートしています。手順は以下のとおりです。

 上記の公式ページにアクセスしてください。

全ブックマーク情報のエクスポート

このようにして、 <ユーザーID>.bookmarks.html ファイルをダウンロードしたら、本ツールの【 ステップ 1 】を実行した後で【 ステップ 2 】として、そのファイルをツール上にドラッグ&ドロップしてください。

全ブックマーク情報のインポート

すぐに全ブックマーク情報が読み込まれます。次に【 ステップ 3 】の実行に進んでください。

【注意点】実行時間の表示について

置換/削除前に、ざっくりとした概算時間をメッセージボックスで表示しますが、あくまで予測であり、正確ではありません。特に「公開」ブックマークで「日付による一括削除」の場合、個々のブックマーク情報を取得しないと日付がチェックできないために、「最長時間」の予測表示になっています(※「公開&非公開」全ブックマークを取得した場合は、「日付による一括削除」でもブックマーク数で予測します)。

はてなブックマークAPIへの処理負荷を軽減するため、5~6秒に1処理ぐらいのペースで処理を行います(※サービス提供側への配慮です)。よって最低でも、100件で9分、1000件で1時間24分、10000件で14時間はかかる計算になります。使わないPCなどでずっと実行したままにするような形で使ってください。12時間以上かかりそうな場合は、(後述のTIPSを参考に)全削除して新たにブックマークを開始した方がよいかもしれません。

※本ツールは分散同時実行には対応していないため、ツールを複数箇所で同時に実行することもしないでください。

【注意点】一括削除時のエラーについて

はてなブックマークのリンク先がない場合など、「はてなブックマーク REST API」内部で何らかのエラーが起きやすいようです。本ツール側では対処のしようがありません。主に404エラーが出るページや、リダイレクト設定がされているページ、不要なクエリパラメーターが多数含まれているページで、このエラーが起きているようです。

エラーが起こったブックマークは、処理結果後のログファイルに記載されています。そのブックマークリンクを開いて、手動で置換/削除処理をしてください。基本的な手順を紹介しておきます。

手動削除手順(1)

(2)はてなブックマークのユーザー数(1 user)をクリックしてください。ゴミ箱ボタンをクリックしても、APIと同じで削除できない現象を確認しています。

これによってブックマークページが表示されるはずですが、次のように表示された場合はすでに削除済みです。

手動削除手順(2)

削除していない場合は次のように表示されるはずです。ここでゴミ箱ボタンをクリックします。

手動削除手順(3)

これによって削除され、[ブックマーク]ボタンが表示されるはずです。

手動削除手順(4)

日付順で最も古いものにアクセスするには、「https://b.hatena.ne.jp/(user-id)/bookmark?page=156」のようなURLでページ番号を指定して最後のページを探せばよいです。取りこぼし分は、ここから手動で削除していくこともできます。※作者確認では、どうしても削除できない項目がありました。はてなブックマーク運営会社に問い合わせてみましたが、やはり「調査の結果、ユーザー側ではできない」とのことで、運営会社側で削除してもらうことができました。

エラーの種類によっては、【 ステップ 2 】と【 ステップ 3 】の一連の処理を何度か繰り返すことで、何とかAPI内部で処理してくれる場合があることを確認しています。必要に応じて、お試しください。

【TIPS】はてなブックマークの全削除

はてなブックマークの全削除機能は、公式に提供されています(情報源「ブックマークの全削除機能の提供を再開しました - はてなブックマーク開発ブログ」)。

上記URLにアクセスし、[ブックマークの全削除]欄の[削除を進める]ボタンをクリックするだけです。

全削除

本ツールの開発について

このツールは無料ですし、あくまで個人の時間で簡易的に(1日ぐらいで)作成したものです。よってas-is(ありのままの状態)での提供とします。

Issues]に質問や不具合の報告をすることは可能です。ただし、上記の理由でこのツール開発に対する作者個人の優先度は低く、対応はあまり期待できないとお考えください。

Pull Requests]も受け付けます。時間があるときには対応します(数カ月~年単位の場合があります)。また、「積極的に開発したい」という方がいらっしゃれば、collaboratorとして招待しますので、何らかの手段でお知らせください。

ライセンス

  • MITライセンス

TensorFlow/Kerasの「kernel_initializer」などは、なぜ「weights(重み)」ではなく「kernel(カーネル)」なのか?

数年前、Kerasを初めて触ったとき、重みの初期化をしようと、APIドキュメントで「weight」を探しても見つからなくて、少し戸惑ったことがありました。その後、Kerasでは「重み」は「kernel」と表現されている箇所があることに気付いたわけですが、初心者には分かりにくいですよね。同じように混乱する人のために、このブログ記事を(手早く=手抜きで)書いて情報共有することにしました。

まずKeras(やTensorFlow 2.x)で重みの初期化を行うには、Denseレイヤーのコンストラクター(厳密には__init__()メソッド)の引数kernel_initializerを使います。他にも「kernel」と命名された引数には、正則化を行うための引数kernel_regularizerや、重み行列に制約を課すための引数kernel_constraintなどがあります。

なんで「weights」ではなく「kernel」? 実用上は問題ないので放置してそのまま使っていましたが、ずっとこの謎が気にかかっていました。最近、情報をあさっていて、Keras作者が直接言及しているGitHub Issues:

を発見したので、その内容を紹介します(※本文通りではない超訳です)。

  • 質問者: Denseレイヤーのパラメーターにkernel_initializerkernel_regularizerkernel_constraint、と「kernel(カーネル)」という名前が付けられていますが、「重み」ですよね。分かりにくいです。
  • 質問者: これってCNNの畳み込み(Conv)レイヤーとの整合性のために名付けられたのですか?( → 返答内容から見て基本的に「Yes」)
  • Keras作者: レイヤーの「重み」には、特徴(行列)とバイアス(ベクトル)の両方が含まれます。
  • Keras作者: カーネルとバイアスを区別する正確な方法が(レイヤー全種で共通化するために)必要でした。
  • Keras作者: そこで「カーネル/バイアス」という名称を採用しました。
  • Keras作者: Denseレイヤーは、「入力サイズ」のウィンドウを持つConvレイヤーの特殊なケースと見ることができます。つまりいずれも「カーネル」を参照するということです。
  • Keras作者: この表記法は、KerasとTensorFlow全体で使用されているため、ディープラーニングコミュニティの大多数が認識しています。つまり「カーネル/バイアス」はデファクトスタンダードなんですよ。
  • 質問者: なるほど~。でも研究論文では「カーネル」と書いているのは見たことないです。私の中では、重みの中にバイアスは含まれていないです。「カーネル」は言い過ぎなので、この命名には反対ですね。

個人的にはすっきりしました。「重み」の初期化って言いつつ「kernel」とコードに記述するのは一致しなくて違和感あるので、「weights」って単語も入れてほしかったですが。

重みの中にバイアスが含まれるのって、重み行列を書くときに、バイアスを$w_0$と書いてその重みテンソルの中に含めるからですよね(たぶん)。でも概念的には重みとバイアスって、(直線で言うと)傾きと切片なんだから別物な気がします。

個人的には質問者に賛成なんだけど、ライブラリ制作者サイドとしては、引数などの「共通化」や「整理された美しさ」などの考えが入って、こういう結果になっているんだろうなと、今のところ納得しています。