首页 > 其他分享 >模拟大模型训练时,单双精度输出不一致?从而加剧幻觉?或导致幻觉?

模拟大模型训练时,单双精度输出不一致?从而加剧幻觉?或导致幻觉?

时间:2024-11-01 19:18:49浏览次数:3  
标签:float64 sequence 单双 length 精度 tf 幻觉 model float32

       下面是 Python 代码。就同样的随机数据,分别在单精度、双精度下做模拟训练与预测,最后比较它们预测的值,发现不一致。

       大家看看,代码是否有问题?

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Dense, LSTM
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers.legacy import SGD
import random
import os

# 固定所有随机种子
np.random.seed(42)
tf.random.set_seed(42)
random.seed(42)

# 禁用 GPU 的非确定性行为
tf.config.experimental.enable_op_determinism()

# 确保TensorFlow使用单线程
tf.config.threading.set_inter_op_parallelism_threads(1)
tf.config.threading.set_intra_op_parallelism_threads(1)

# 确保NumPy使用单线程
os.environ['OMP_NUM_THREADS'] = '1'

# 确保TensorFlow使用CPU进行计算
os.environ['CUDA_VISIBLE_DEVICES'] = ''

# 生成模拟数据
def generate_data(num_samples, sequence_length):
    int_x = np.random.randint(0, 10, size=(num_samples, sequence_length))
    x = int_x.astype(np.float64)  # 生成双精度数据
    y = np.zeros((num_samples, sequence_length), dtype=np.float64)  # 生成双精度数据
    for i in range(num_samples):
        for j in range(sequence_length):
            if int_x[i][j] == 1:
                y[i][j] = 1
                if j + 1 < sequence_length:
                    y[i][j + 1] = 1
    return x, y

# 超参数设置
num_samples = 10000
sequence_length = 10
batch_size = 32
epochs = 10
learning_rate = 0.001

# 构建模型
def build_model(dtype):
    tf.keras.backend.clear_session()
    tf.random.set_seed(42)
    model = Sequential()
    model.add(LSTM(128, input_shape=(sequence_length, 1), return_sequences=True, dtype=dtype,
                   kernel_initializer=tf.keras.initializers.GlorotUniform(seed=42),
                   recurrent_initializer=tf.keras.initializers.Orthogonal(seed=42),
                   bias_initializer=tf.keras.initializers.Zeros()))
    model.add(Dense(1, activation='sigmoid', dtype=dtype,
                    kernel_initializer=tf.keras.initializers.GlorotUniform(seed=42),
                    bias_initializer=tf.keras.initializers.Zeros()))
    return model

# 使用确定性的优化器
optimizer = SGD(learning_rate=learning_rate, momentum=0.0, nesterov=False)

# 准备数据
x, y = generate_data(num_samples, sequence_length)
x_float64 = x.reshape(num_samples, sequence_length, 1)
y_float64 = y.reshape(num_samples, sequence_length, 1)

# 双精度训练
model_float64 = build_model(tf.float64)
model_float64.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])
history_float64 = model_float64.fit(x_float64, y_float64, batch_size=batch_size, epochs=epochs, verbose=1)
predictions_float64 = model_float64.predict(x_float64)

# 单精度训练
x_float32 = x_float64.astype(np.float32)
y_float32 = y_float64.astype(np.float32)
model_float32 = build_model(tf.float32)
model_float32.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])
history_float32 = model_float32.fit(x_float32, y_float32, batch_size=batch_size, epochs=epochs, verbose=1)
predictions_float32 = model_float32.predict(x_float32)

# 比较预测结果
print("First few elements of third column in double precision predictions:")
print(predictions_float64.flatten()[:5])
print("First few elements of third column in single precision predictions:")
print(predictions_float32.flatten()[:5])

# 检查是否完全相同
if np.allclose(predictions_float64, predictions_float32, atol=1e-7):
    print("Predictions are consistent between double and single precision.")
else:
    print("Predictions are not consistent between double and single precision.")

运行后输出:

点评:这段代码有问题吗?若没问题,那么最后结果误差比较大:单精度与双精度的结果的有效数字中,只有1位或2位相同数字。这意味着什么呢?错误的词向量。

       假设大模型给出的正确答案是100个字(即大模型要一个接一个地吐出100个字),若第20个字的计算有一点点误差,那么第20个字就错了,第21个就更错了,第22个就更更错了,...,所以后面的80个字就全错了(错的一塌糊涂,即一本正经的胡说八道)。本来是笔直的一条路,可是在第20个字那儿,稍微拐了一下,后果就是越到后面,偏的越厉害。

标签:float64,sequence,单双,length,精度,tf,幻觉,model,float32
From: https://blog.csdn.net/zaim1/article/details/143422690

相关文章

  • 《高精度除法》
    【题目描述】输入一个高精度数,一个低精度数(int),然后求高精度数除以低精度数的商和余数并输出。【样例输入】223344556677892【样例输出】111672278338941#include<bits/stdc++.h>usingnamespacestd;intmain(){strings;intt;cin>>s;cin>>t;inta[......
  • 论文阅读Nature:Detecting hallucinations in large language models using semantic e
    论文阅读-Nature:Detectinghallucinationsinlargelanguagemodelsusingsemanticentropy(使用语义熵来检测大模型中的幻觉)作者:SebastianFarquhar,JannikKossen,LorenzKuhn&YarinGal单位:牛津大学,计算机科学学院,OATML实验室期刊:Nature时间线:2023年7月提交→......
  • AP5126 是一款 PWM 工作模式,高效率、外围简单、内置功率管,适用于 12-80V 输入的高精
    高性能摩托车灯降压恒流ic全亮/半亮/循环模式短路保护AP5126产品描述AP5126是一款PWM工作模式,高效率、外围简单、内置功率管,适用于12-80V输入的高精度降压LED恒流驱动芯片。输出最大功率可达15W,最大电流1.2A。AP5126可实现全亮/半亮功能切换,通过MODE切换:全亮/半亮/......
  • AP5127 是一款 PWM 工作模式,高效率、外围简单、内置功率管,适用于 12-100V 输入的高精
    产品描述AP5127是一款PWM工作模式,高效率、外围简单、内置功率管,适用于12-100V输入的高精度降压LED恒流驱动芯片。输出最大功率可达25W,最大电流2.5A。AP5127可实现全亮/半亮功能切换,通过MODE切换:全亮/半亮/循环模式。AP5127工作频率固定在140KHZ,同时内置抖频电路,......
  • AP5216 是一款 PWM工作模式, 高效率、外围简单、内置功率管,适用于5V~100V输入的高精度
    产品描述AP5216是一款PWM工作模式,高效率、外围简单、内置功率管,适用于5V~100V输入的高精度降压LED恒流驱动芯片。输出最大功率可达9W,最大电流1.0A。AP5216可实现全亮/半亮功能切换,通过MODE切换:全亮/半亮模式。AP5216工作频率固定在130KHZ,同时内置抖频电路,可以降低......
  • UE 设置高精度DEM的方法(UE中地形呈阶梯状的解决办法)
    使用UE创建地形,不可避免要使用dem作为地形,来创建数字孪生项目。可是,会碰到一个问题:使用png导入的地形,有明显的阶梯状,如下图所示:阶梯状DEM所以是什么原因呢?答:DEM数据本就如此。1、常规非涉密的DEM,是大于等于30米,也就是30米×30米的一个方形,变成一个值,还保留int类型,自然会有至少......
  • 提高ADC采样精度:C语言中的滤波与取平均值技巧
    在嵌入式系统中,ADC(模数转换器)是常用的组件,用于将模拟信号转换为数字信号。然而,由于噪声和其他干扰因素,ADC采样值可能会波动,导致读数不稳定。为了提高ADC读数的准确性,常用的方法是进行滤波和取平均值。本文将详细介绍如何在C语言中实现ADC采样值的滤波和取平均值,并提供详细的代......
  • Long类型后端到前端精度丢失问题
     在开发中,后端经常需要处理一些大数值的Long类型数据(id等)。但当这些数据通过接口传递到前端时,可能会出现精度丢失的问题。原因:JavaScript的Number类型遵循IEEE754双精度浮点数标准,只能精确表示范围在-(2^53-1)到2^53-1之间的整数(约等于-9007199254740991......
  • LCD手机屏幕高精度贴合
    LCD手机屏幕贴合,作为智能手机生产线上至关重要的一环,其质量直接关乎用户体验与产品竞争力。这一工艺不仅要求屏幕组件间的无缝对接,达到极致的视觉与触觉效果,还需确保在整个生产过程中,从材料准备到最终成品,每一步都严格遵循高标准的质量控制流程。贴合机作为加工这一精密任务的......
  • 高精度减法
    #include<bits/stdc++.h>usingnamespacestd;stringa,b;boolf(){if(a.size()>b.size()){returntrue;}else{for(inti=0;i<a.size();i++){if(b[i]>a[i]){returnfalse;}......