「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > FP と BF の違いは何ですか。ここでわかりやすい説明をします

FP と BF の違いは何ですか。ここでわかりやすい説明をします

2024 年 8 月 17 日に公開
ブラウズ:272

What is the difference between FPand BF Here a good explanation for you

浮動小数点表現:

FP16 (半精度): FP16 では、浮動小数点数が 16 ビットを使用して表現されます。符号ビット 1 ビット、指数部 5 ビット、小数部 (仮数部) 10 ビットで構成されます。この形式は、その範囲内の小数値をより高い精度で表現します。

BF16 (BFloat16): BF16 も 16 ビットを使用しますが、分布が異なります。 1 つの符号ビット、8 ビットの指数、7 ビットの仮数があります。この形式では、より広範囲の指数に対応するために、小数部分の精度がある程度犠牲になります。

数値範囲:

FP16 の範囲は狭いですが、仮数部が 10 ビットであるため、その範囲内の精度は高くなります。
BF16 の範囲は広いですが、指数が 8 ビットで仮数が 7 ビットであるため、小数値の精度が低くなります。

例:

3 つの例を使用して、FP16 と BF16 の違いを説明しましょう。 TensorFlow は、下部で共有されるテストとコードを作成するために使用されます:

元の値: 0.0001 — どちらのメソッドも
FP16: 0.00010001659393 (バイナリ: 0|00001|1010001110、16 進数: 068E) — 10 個の仮数と 5 個の指数
BF16: 0.00010013580322 (バイナリ: 0|01110001|1010010、16 進数: 38D2) — 7 つの仮数と 8 つの指数

ご覧のとおり、指数と仮数が異なるため、異なる方法で表現できます。 しかし、FP16 では、より近い値でより正確に表現されていることがわかります。

元の値: 1e-08 (0.00000001)
FP16: 0.00000000000000 (バイナリ: 0|00000|0000000000、16 進数: 0000)
BF16: 0.00000001001172 (バイナリ: 0|01100100| 0101100、16進数: 322C)

これは非常に興味深いケースです。 FP16 は失敗し、結果は 0 になりますが、BF16 は特別な形式でそれを表現できます。

元の値: 100000.00001
FP16: inf (バイナリ: 0|11111|0000000000、16 進数: 7C00)
BF16: 99840.00000000000000 (バイナリ: 0|10001111| 1000011、16 進数: 47C3 )

上記の場合、すべての指数ビットがいっぱいになり、値を表すのに十分ではないため、FP16 は失敗します。ただしBF16は動作します

ユースケース:

FP16 は、ディープ ラーニングのトレーニングと推論、特に限られた範囲内で小さな小数値を表現する際に高精度が必要なタスクによく使用されます。

BF16 は、小数部分の精度が多少犠牲になっても、より広範囲の表現可能な値の恩恵を受ける機械学習タスク用に設計されたハードウェア アーキテクチャで人気が高まっています。これは、大きな勾配を扱う場合、または小さな値の精度よりも広範囲にわたる数値の安定性が重要な場合に特に役立ちます。

要約すれば

FP16 は、より狭い範囲内の分数値の精度が高いため、小さな数値を正確に表現する必要があるタスクに適しています。一方、BF16 は、ある程度の精度を犠牲にしてより広い範囲を提供するため、より広範囲の値を扱うタスクや、広範囲にわたる数値の安定性が重要なタスクに有利です。 FP16 と BF16 のどちらを選択するかは、当面の機械学習タスクの特定の要件によって異なります。

最終結論

上記の理由により、安定拡散 XL (SDXL) トレーニングを行う場合、FP16 と BF16 ではわずかに異なる学習率が必要となり、BF16 の方が効果的であることがわかりました。

上記の例の生成に使用したコード

import tensorflow as tf
import struct

def float_to_binary(f):
    return ''.join(f'{b:08b}' for b in struct.pack('>f', f))

def display_fp16(value):
    fp16 = tf.cast(tf.constant(value, dtype=tf.float32), tf.float16)
    fp32 = tf.cast(fp16, tf.float32)
    binary = format(int.from_bytes(fp16.numpy().tobytes(), 'big'), '016b')
    sign = binary[0]
    exponent = binary[1:6]
    fraction = binary[6:]
    return f"FP16: {fp32.numpy():14.14f} (Binary: {sign}|{exponent}|{fraction}, Hex: {fp16.numpy().view('uint16'):04X})"

def display_bf16(value):
    bf16 = tf.cast(tf.constant(value, dtype=tf.float32), tf.bfloat16)
    bf32 = tf.cast(bf16, tf.float32)
    binary = format(int.from_bytes(bf16.numpy().tobytes(), 'big'), '016b')
    sign = binary[0]
    exponent = binary[1:9]
    fraction = binary[9:]
    return f"BF16: {bf32.numpy():14.14f} (Binary: {sign}|{exponent}|{fraction}, Hex: {bf16.numpy().view('uint16'):04X})"

values = [0.0001, 0.00000001, 100000.00001]

for value in values:
    print(f"\nOriginal value: {value}")
    print(display_fp16(value))
    print(display_bf16(value))
リリースステートメント この記事は次の場所に転載されています: https://dev.to/furkangozukara/what-is-the-difference-between-fp16-and-bf16-here-a-good-explanation-for-you-gag?1もしあれば権利侵害、削除するには、[email protected] までご連絡ください。
最新のチュートリアル もっと>
  • Webスクレイピング - 面白いですね!
    Webスクレイピング - 面白いですね!
    クールな用語: CRON = 指定された間隔でタスクを自動的にスケジュールするプログラミング技術 ウェブって何? プロジェクトなどを調査するとき、私たちは通常、日記、エクセル、ドキュメントなど、さまざまなサイトから情報を書き込みます。 私たちはウェブをスクレイピングし、手動でデータ...
    プログラミング 2024 年 11 月 6 日に公開
  • お客様の声グリッドセクション
    お客様の声グリッドセクション
    ? CSS グリッドを学習しながら、このお客様の声グリッド セクションの作成が完了しました。 ?グリッドは構造化されたレイアウトの作成に最適です。 ?ライブデモ: https://courageous-chebakia-b55f43.netlify.app/ ? GitHub: https://gi...
    プログラミング 2024 年 11 月 6 日に公開
  • REGISTER_GLOBALS が PHP の主要なセキュリティ リスクとみなされるのはなぜですか?
    REGISTER_GLOBALS が PHP の主要なセキュリティ リスクとみなされるのはなぜですか?
    REGISTER_GLOBALS の危険性REGISTER_GLOBALS は、すべての GET 変数と POST 変数を PHP スクリプト内でグローバル変数として使用できるようにする PHP 設定です。この機能は便利に見えるかもしれませんが、潜在的なセキュリティ脆弱性やコーディング方法のため、使...
    プログラミング 2024 年 11 月 6 日に公開
  • Nodemailer の概要: Node.js での簡単な電子メール送信
    Nodemailer の概要: Node.js での簡単な電子メール送信
    Nodemailer は、メールを送信するための Node.js モジュールです。簡単な概要は次のとおりです: トランスポーター: 電子メールの送信方法を定義します (Gmail、カスタム SMTP など経由)。 const transporter = nodemailer.createTra...
    プログラミング 2024 年 11 月 6 日に公開
  • JavaScript での簡単なエラー処理: 安全な代入演算子がコードを簡素化する方法
    JavaScript での簡単なエラー処理: 安全な代入演算子がコードを簡素化する方法
    JavaScript でのエラー処理は面倒になる場合があります。 try/catch ステートメントで大きなコード ブロックをラップすることは機能しますが、プロジェクトが成長するにつれて、デバッグは悪夢のようになります。幸いなことに、もっと良い方法があります。 安全な代入演算子 (?=) を入力しま...
    プログラミング 2024 年 11 月 6 日に公開
  • Javascript は難しい (ESadness あり)
    Javascript は難しい (ESadness あり)
    長文になりますが、もう一度言わせてください。 JAVASCRIPTは難しいです。最後に会ったとき、私は Javascript の世界に足を踏み入れていました。目を輝かせ、希望に満ちたプログラマーが野生のジャングルに足を踏み入れ、「これはどれほど難しいことでしょう?」と言いました。私はどれほど間違っ...
    プログラミング 2024 年 11 月 6 日に公開
  • ## JavaScript を使用せずに CSS で円グラフのセグメントを作成できますか?
    ## JavaScript を使用せずに CSS で円グラフのセグメントを作成できますか?
    CSS を使用した円のセグメントborder-radius を使用して CSS で円を作成するのが一般的です。しかし、円グラフに似たセグメントを使用しても同様の効果を達成できるでしょうか?この記事では、JavaScript の使用を除き、HTML と CSS だけでこれを実現する方法について詳しく説...
    プログラミング 2024 年 11 月 6 日に公開
  • 小さなベクター ストアをゼロから構築する
    小さなベクター ストアをゼロから構築する
    With the evolving landscape of generative AI, vector databases are playing crucial role in powering generative AI applications. There are so many vect...
    プログラミング 2024 年 11 月 6 日に公開
  • Chrome で AI 実験 API を使用する方法
    Chrome で AI 実験 API を使用する方法
    Chrome で試験運用版 AI API を使用するには、次の手順に従ってください: ハードウェア要件 4GB RAM GPU が利用可能 最低 22GB のスペース Windows 10.11 または macOS Ventura 以降のバージョン (Linux 仕様なし) 次はまだ...
    プログラミング 2024 年 11 月 6 日に公開
  • レビュー: Django DX をブーストする (Adam Johnson 著)
    レビュー: Django DX をブーストする (Adam Johnson 著)
    本のレビューはデリケートです。ネタバレするつもりはありませんが、潜在的な読者に何が期待されるのかを感じてもらいたいと考えています。これは、コンテキストの提供と興味を維持することの間の巧みなバランスです。このレビューでは、あまり多くを明らかにせずに、あなたを誘惑するのに十分なだけの情報を提供することで...
    プログラミング 2024 年 11 月 6 日に公開
  • 配列要素をグループ化し、多次元配列の別の列の値を結合する方法
    配列要素をグループ化し、多次元配列の別の列の値を結合する方法
    配列要素を列ごとにグループ化し、別の列の値を結合する2 つの列を持つネストされた配列を含む配列が与えられた場合、タスクはグループ化することです。特定の列に基づいてサブ配列を作成し、各グループ内の別の列の値を連結して、カンマ区切りのリストを作成します。次の配列の例を考えてみましょう。$array = ...
    プログラミング 2024 年 11 月 6 日に公開
  • 新たに追加された 3 つの例外機能
    新たに追加された 3 つの例外機能
    JDK 7 以降、例外処理は 3 つの新機能 (自動リソース管理、マルチキャッチ、より正確な再スロー) で拡張されました。 マルチキャッチを使用すると、同じ catch 句で複数の例外をキャッチでき、コードの重複を回避できます。 マルチキャッチを使用するには、例外のリストを | で区切って指定しま...
    プログラミング 2024 年 11 月 6 日に公開
  • ES6 コード実行時の「予期しないトークンのエクスポート」エラーを修正する方法?
    ES6 コード実行時の「予期しないトークンのエクスポート」エラーを修正する方法?
    「予期しないトークン エクスポート エラーのトラブルシューティング」プロジェクト内で ES6 コードを実行しようとすると、「予期しないトークン エクスポート」エラーが発生する場合があります。このエラーは、使用されている環境が ES6 モジュールで採用されているエクスポート キーワード構文をサポートし...
    プログラミング 2024 年 11 月 6 日に公開
  • アンインストールしても VSCode 拡張機能がファイル システムから削除されないため、解決策を作成しました。
    アンインストールしても VSCode 拡張機能がファイル システムから削除されないため、解決策を作成しました。
    つまり、これは vscode ベースのエディターの問題です。拡張機能をアンインストールした後でも、拡張機能はファイル システムに残り、時間の経過とともにシステムが停止します。簡単なソリューションを作成しました。この Python スクリプトを実行すると、vscode にインストールされていない拡張機...
    プログラミング 2024 年 11 月 6 日に公開
  • GitHub Actions を介して Web サイトのコンテンツをスケジュールどおりに更新する
    GitHub Actions を介して Web サイトのコンテンツをスケジュールどおりに更新する
    従来の意味でのコンテンツ データベースを必要としない、自立可能なコンテンツ管理システムを構築する私のこれまでの道のりを共有したいと思います。 問題 この Web サイトのコンテンツ (ブログ投稿とブックマーク) は Notion データベースに保存されています: ブックマークのあるデ...
    プログラミング 2024 年 11 月 6 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3