admin

  • 标题:微软Ignite举行,Azure多款数据库发布DiskANN向量索引; Aurora Serverless 支持自动暂停和恢复;Aurora支持R7i实例

    重要更新

    微软Ignite本周举行,大量AI/Copilot功能发布,数据库相关发布包括 DiskANN 向量索引功能在多个数据库产品上发布,包括Cosmos DB for MongoDB、托管PostgreSQL 等 ,托管 MySQL发布支持8.4 / 9.1等版本、托管PostgreSQL支持index tuning等  [1] 

    更新详情

    阿里云
    • RDS MySQL全球多活数据库(GAD)新增支持Serverless实例作为从角色,可有效提升您业务的资源弹性,并节省数据库运维成本。[4]
    • RDS MySQL透明数据加密(TDE)能力新增支持高可用系列云盘实例。[5]
    • 云数据库 MongoDB 版云盘版副本集实例支持恢复单个或多个数据库至原实例。[6]
    • 云数据库 MongoDB 版云盘版副本集实例新增了按Key闪回功能,该功能适用于小部分数据错乱或意外丢失场景,根据数据的闪回Key可对这部分数据进行回档,快速恢复数据。[7]
    GCP(谷歌云)
    • 对于 Cloud SQL Enterprise Plus 版本实例,可以使用高级灾难恢复 (DR) 来简化执行跨区域故障转移后的恢复和回退过程 [10] [11] 
    • Cloud SQL Enterprise Plus 版本主实例的计算规格(vCPU、内存)进行不频繁弹性(每三小时一次)时可以实现接近零停机时间(near-zero downtime)[18] 
    火山云(字节)
    • 云数据库 MySQL 将变更实例配置功能按照规格变更、增加节点和删除节点进行功能拆分,降低功能耦合度
    • 云数据库 MySQL 为实例提供 IP 地址,满足用户在不同业务场景下对连接实例的需求。
    • 云数据库 MySQL 为白名单提供了复制、同步和批量解绑实例功能,提升产品使用体验。
    • 云数据库 MySQL 优化实例列表的实例搜索能力,新增按 IP 地址的搜索方式。
    • 云数据库 SQL Server 版支持在创建实例时为实例配置可维护时间段。[33]
    • 云数据库 SQL Server 版正式支持售卖创建 3il 规格的实例。[35]
    Azure(微软云)
    • Cosmos DB for MongoDB (vCore) 支持自动扩展(auto-scale)  [22] 
    • Cosmos DB for MongoDB (vCore) 支持DiskANN向量索引  [26] 
    • Cosmos DB for MongoDB 支持 Change Stream,以方便获取数据变更  [23] 
    • 托管 PostgreSQL 实例支持弹性集群(Citus) [24] 
    • 托管 PostgreSQL 实例支持DiskANN 向量索引  [25]
    AWS(亚马逊云)
    • Aurora Serverless v2 支持自动暂停和恢复 [45]
    • Amazon Aurora 支持自动迁移 EC2 数据库[46]
    • Amazon RDS 代理支持 RDS for PostgreSQL 17[51]
    • Amazon Aurora MySQL 3.08(兼容 MySQL 8.0.39)现已正式发布[64]
    • Amazon Aurora MySQL 现在支持 R7i 实例 [70]

    参考链接

  • 对话式的大语言模型产品已经在改变我的很多日常习惯。鉴于 ChatGTP 国内访问非常不方便,现在也逐渐的在尝试使用通义千问、文心一言等产品。总体上感觉,通义千问和文心一言也都非常不错了,满足基本的日常使用是完全没有问题的,但相比于 ChatGPT 还是差了那么一点意思。这里记录一些日常使用的对比,看看,所谓的那么“一点意思”到底是什么。

    简要的问题和简要的回答

    这里的问题是:“方括号 英语”。来看看 ChatGPT、通义千问、文心一言的回答:

    ChatGPT

    通义千问

    文心一言

    可以看到,三个引擎都给出准确的答案。其中,ChatGPT 给出的回答最为简洁,也是这里我最为偏好的回答。

    为什么这里给出简单的回答更好呢?

    这里的问题非常简单,这时候,通常也是期望更为简单的回答的。试想这样的场景,你在写一篇英语小短文,但你不确定“方括号”的英语怎么说,恰好你旁边有一个英语很好的同事,你问她:“方括号的英语是?”。如果她像上述通义千问、文心一样,说了一大堆,你可能会打断她,因为当下写材料才是重点,不是想学英语。如果,我真的想学英语的话,我的问题,则可能是这样:“方括号 英语 并给出示例”。

    一般的,简单的问题简单回答就可以了。如果用户期待更多信息或者更详尽的回复,通常也会更详细的描述问题。

    再比如:“Latex表示一个矩阵(方括号): 变量用x表示,共n_x行,m列。其中行号用下标表示,列用带有括号的上标表示”

    ChatGPT

    通义千问

    文心一言

    同样的,ChatGPT 更简洁,通义千问次之,文心一言则略显啰嗦。毕竟,这时候我只是想要答案,不想知道获得这个结果的完整的推理过程。

    类似的,再比如:

    ChatGPT

    通义千问

    文心一言

    “分总/总分总”与“递进式”的结构

    我们来看看如下问题,不同的大模型的回答:使用中文介绍一下“Goldsmiths Research Online”

    ChatGPT

    通义千问

    文心一言

    可以看一下这个三个回答的对比,通义千问和文心一言,都使用了“总分总”或“分总”的结构去回答问题。而,ChatGPT则使用了递进式的结构,显得更加自然。

    同时,因为通义千问和文心一言总是倾向于使用“总分总”或“分总”类似的结构,所以就就会给人比较呆板一些的感受。

    前端展示效果

    因为最近在学习机器学习的一些原理,所以,有时候会让 ChatGPT 帮助编写一些数学公式。这里的问题是:x是一个3×4的矩阵,每个元素分别是1…12,使用latex写出这个矩阵。

    ChatGPT

    通义千问

    文心一言

    可以看到,ChatGPT 在前端应该使用了类似Latex的前端组件,有更好的展示效果。而通义千问、文心一言则没有使用类似组件去展示。根据测试,通义千问、文心一言也都是支持 Latex 的前端展示,只是不会经常使用。

    最后

    总体感觉,在日常使用中,通义千问、文心一言和 ChatGPT 差别并不是很明显,早期通过各种方式去科学访问 ChatGPT 现在看起来必要性并没有那么高了。但,在一些细节点上,还存在一些差距,期待通义千问、文心一言都后续的版本能够变得更强。

  • 标题:OceanBase 数据库大赛决赛正式启动; GCP AlloyDB/Azure SQL Database Hyperscale 均支持 128 TB存储

    重要更新

    OceanBase 数据库大赛决赛正式启动,决赛时间从11月15日~12月2日,之后将进行答辩并评出冠军,感兴趣的可以关注。 [1]  

    更新详情

    GCP(谷歌云)
    • AlloyDB 现在在提供 AlloyDB 服务的 所有区域 中支持每个集群高达 128 TiB 的存储 [5] 
    • Cloud SQL 支持自动创建 Private Service Connect ,而无需在创建实例后手动创建 [6] 
    • GCP 数据库迁移服务现在支持 MySQL 次要版本 8.0.39,用于同构 MySQL 迁移 [29] 
    Azure(微软云)
    • Azure SQL Database Hyperscale 先最大支持 128 TB 存储  [10] 
    Oracle云
    • 托管 PostgreSQL 新增支持 PostgreSQL 15 [30]
    火山云(字节)
    • 托管 MySQL 服务支持用户根据自己的业务需求为实例创建代理终端或直连终端  [7] 
    • 托管 MySQL 提供了连接诊断功能,支持用户自主进行对实例连接问题进行诊断和修复。 [8] 
    • 托管 MySQL 支持为普通数据库账号进行全局授权,并支持在创建和授权过程中预览相关的 SQL 语句  [9] 
    • VeDB MySQL 支持为实例开启删除保护功能,避免因误操作导致实例删除。[34]
    • VeDB MySQL 删除或退订实例时,默认会创建并保留一个最终备份。并且,保留的最终备份不再支持手动删除,会根据备份的完成时间,在 7 天后被系统自动删除。[35]
    AWS(亚马逊云)
    • Amazon RDS 支持 MySQL 8.0.40 [37]
    • Timestream for InfluxDB 现已在中国区域推出 [40]
    • RDS for SQL Server 于 2024 年 10 月支持了更多小版本更新 [52]
    • RDS for Oracle 于 2024 年 10 月支持了更多新的小版本更新 [53]
    腾讯云
    • 云数据库 MySQL 8.0内核版本更新20230702,提升数据库性能与稳定性 [54]
    • 云数据库 MySQL / TDSQL-C MySQL 发布数据库代理版本1.3.14  [55] [58] 

    参考链接

  • Oracle Cloud 是所有云平台最先支持 9.0 版本的。这里,我们来看看该版本的“标准性能”表现如何。

    测试实例与环境说明

    这里使用的实例类型是:MySQL.4,单个节点为4 ecpu 32gb,测试区域选择的是“东京”(ap-tokyo-1),多可用区(FAULT DOMAIN)的版本,测试实例存储空间大小为 100 gb。即:

    instance_type=MySQL.4
    vcpu_per_node=4
    memory_size_per_node=32
    region=tokyo
    availability=multi-az
    storage_size=100
    db_version=8.0.39/8.4.2/9.0.1

    性能对比

    本次测试分别测试了 8.0.39/8.4.2/9.0.1 这三个版本。详细的性能对比如下:

    dataMySQL80MySQL84MySQL90
    4355136063360
    8593653785256
    16805481867287
    32831780297817
    48813082047911
    64783879818060
    96850484308172
    128819882868000
    192804380538112
    256790780347536
    384820980558151
    512838680307872

    性能概述

    从该“标准”测试来看,9.0.1的性能较为稳定。从上述数据中来看,似乎略微低于 8.0和8.4 版本,但经过调查,主要原因是由于云平台 CPU 资源多少所导致的,而并不是数据库本身的问题。

    此外,在今年5月份观察到的8.4性能退化问题(参考),目前也已经解决。

  • 在开始之前,也没想到99行代码就够了,原以为里面有个“梯度下降”,代码行数应该是数百级别吧,实际完成后,发现加上注释(约35%)才99行。


    “极简”神经网络的结构

    先来看“极简”有多简:

    • 一个输入层、一个输出层,中间没有隐藏层
    • 输入层的样本数据就一个特性(feature),总计6个样本
    • 这是二分类问题,所以输出层就一个输出值
       x ->   w*x + b   ->   logistic function  -> output
            ----------------------------------
                 |                    |
                 V                    V
             one neuron     activation function

    在后续的实现中,我们构造了六个样本用于该神经网络的训练。

    鉴于这个“极简”神经网络,没有任何隐藏层,所以,这也是一个典型的“logistic regression”问题。

    前置知识

    你需要了解如下的前置知识,以很好的理解该神经网络的实现与训练:

    • 了解神经网络的基础:浅层神经网络
    • 了解 梯度下降算法,了解基本最优化算法概念,了解链式法则
    • 了解 logistic function 的基本特性
    • 了解 Python 和 NumPy 的基本使用

    问题描述与符号约定

    用于训练的样本数据有\( (x,\hat{y}) \): \( (1,0)、(2,0)、(3,0)、(4,0)、(5,1)、(6,1) \)。

    一个具体的样本,在下面的公式中通常使用 \( (x^{(j)}, y^{(j)}) \)表示, 其中,\( j = 1…m \)。

    \( \hat{y} \)则表示根据参数计算出的预测值,更为具体的 \( \hat{y}^{(j)} \)表示 \(x = x^{(j)} \)时的预测值。

    构建目标函数

    从样本数据可以看到,这是一个二分类问题,可以使用logistic function作为输出层的激活函数,如果输出值大于0.5,则预测为1,否则预测为0

    对于任何一个样本,就可以如下函数作为logistic function的损失函数\( L \):

    $$
    L(y,\hat{y}) = – (yln(\hat{y}) + (1-y)ln(1-\hat{y}))
    $$

    所以,全局的目标函数就是:

    $$
    \begin{aligned}
    J(w,b) & = \frac{1}{m} \sum\limits_{j=0}^{m} L(y^{(j)},\hat{y}^{(j)}) \\
    & = \frac{1}{m} \sum\limits_{j=0}^{m} – (y^{(j)}ln(\hat{y}^{(j)}) + (1-y^{(j)})ln(1-\hat{y}^{(j)}))
    \end{aligned}
    $$

    其中 \( m \)表示总样本数量,这里取值是6。在这个极简的神经网络中 \( \hat{y} \)有如下计算表达式:

    $$
    \hat{y} = \frac{1}{1+e^{-(wx+b)}}
    $$

    最终,该神经网络的参数求解(也就是“训练”)过程,就是求解如下的极值问题:

    $$
    (w,b) = \min_{w, b} J(w, b) = \min_{w,b} \frac{1}{m} \sum\limits_{j=0}^{m} L(y^{(j)},\hat{y}^{(j)})
    $$

    目标函数计算的具体代码如下:

    def cost_function(w_p,b_p,x_p,y_p):
        c = 0
        for i in range(m):
            y = function_f(x_p[i],w_p,b_p)
            c += -y_p[i]*math.log(y) - (1-y_p[i])*math.log(1-y)
        return c

    梯度计算

    前面介绍了很多梯度的内容,这里不再详述。在这个具体的问题中,需要求解的梯度为:

    $$
    (\frac{\partial J}{\partial w},\frac{\partial J}{\partial b})
    $$

    在这里,简单展示该梯度的计算,主要需要使用的是链式法则和基本的求导/微分运算。

    首先,为了便于计算,这里记:

    $$
    \begin{aligned}
    \hat{y} & = \frac{1}{1+e^{-z}} \\
    z & = w*x + b
    \end{aligned}
    $$

    所以,根据链式法则容易有:

    $$
    \frac{\partial L}{\partial w} = \frac{\partial L}{\partial \hat{y}} * \frac{\partial \hat{y}}{\partial z} * \frac{\partial z}{\partial w} \\
    \frac{\partial L}{\partial b} = \frac{\partial L}{\partial \hat{y}} * \frac{\partial \hat{y}}{\partial z} * \frac{\partial z}{\partial b}
    $$

    这其中,\( \frac{\partial L}{\partial \hat{y}} \) 和 \( \frac{\partial \hat{y}}{\partial z} \)略有一些计算量,\( \frac{\partial z}{\partial w} \) 和\( \frac{\partial z}{\partial b} \)比较简单,具体的:

    $$
    \begin{aligned}
    \frac{\partial L}{\partial \hat{y}} * \frac{\partial \hat{y}}{\partial z} & = \hat{y} – y \\
    \frac{\partial z}{\partial w} & = x \\
    \frac{\partial z}{\partial b} & = 1
    \end{aligned}
    $$

    所以,最终的梯度计算公式如下:

    $$
    \begin{aligned}
    \frac{\partial J}{\partial w} & = \frac{1}{m} \sum\limits_{j=1}^{m} (\hat{y}^{(j)} – y^{(j)})*x^{(j)} \\
    \frac{\partial J}{\partial b} & = \frac{1}{m} \sum\limits_{j=1}^{m} (\hat{y}^{(j)} – y^{(j)})
    \end{aligned}
    $$

    在实际的计算中,先通过正向传播(Forward Propagation)计算出\( \hat{y}^{(j)} \),然后在计算出梯度。此外,可以使用NumPyndarray简化表达,同时增加计算的并行性。这里为便于理解,全部都使用标量计算,在文章的最后也提供了NumPy的对应实现。

    正向传播计算如下:

    # function_f: 
    # x   : scalar
    # w   : scalar
    # b   : scalar
    def function_f(x,w,b):  
        return 1/(1+math.exp(-(x*w+b)))

    梯度(反向传播)计算如下:

    # Gradient caculate 
    # x_p: x_train
    # y_p: y_train
    # w_p: current w
    # b_p: current b
    def gradient_caculate(x_p,y_p,w_p,b_p):
        gradient_w,gradient_b = (0.,0.)
        for i in range(m):
            gradient_w += x_p[i]*(function_f(x_p[i],w_p,b_p)-y_p[i])
            gradient_b += function_f(x_p[i],w_p,b_p)-y_p[i]
        return gradient_w,gradient_b

    梯度下降迭代

    这里设置迭代次数为50000次,学习率设置为0.01,当迭代目标函数变化值小于0.000001时也停止迭代(这并不是必须的)。具体的:

    iteration_count = 50000
    learning_rate = 0.01
    cost_reduce_threshold = 0.000001

    于是又如下梯度下降迭代过程的代码:

    cost_last = 0
    for i in range(iteration_count):
        grad_w,grad_b = gradient_caculate(x_train,y_train,w,b)
        w = w - learning_rate*grad_w
        b = b - learning_rate*grad_b
        cost_current = cost_function(w,b,x_train,y_train)
        if i >= iteration_count/2 and cost_last - cost_current<= cost_reduce_threshold:
            print("iteration: {:5d},cost_current:{:f},cost_last:{:f},cost reduce:{:f}".format( i+1,cost_current,cost_last,cost_last-cost_current))
            break
        if (i+1)%(iteration_count/10) == 0:
            print("iteration: {:5d},cost_current:{:f},cost_last:{:f},cost reduce:{:f}".format( i+1,cost_current,cost_last,cost_last-cost_current))
        cost_last = cost_current

    预测

    完成训练后,则可以对输入值进行预测。代码如下:

    print("after the training, parameter w = {:f} and b = {:f}".format(w,b))
    
    for i in range(m):
        y = function_f(x_train[i],w,b)
        p  = 0
        if y>= 0.5: p  = 1
        print("sample: x[{:d}]:{:d},y[{:d}]:{:d}; the prediction is {:d} with probability:{:4f}".format(i,x_train[i],i,y_train[i],p,y))

    上述代码会产生如下的输出:

    after the training, parameter w = 5.056985 and b = -22.644516
    sample: x[0]:0,y[0]:0; the prediction is 0 with probability:0.000000
    sample: x[1]:1,y[1]:0; the prediction is 0 with probability:0.000000
    sample: x[2]:2,y[2]:0; the prediction is 0 with probability:0.000004
    sample: x[3]:3,y[3]:0; the prediction is 0 with probability:0.000568
    sample: x[4]:4,y[4]:0; the prediction is 0 with probability:0.081917
    sample: x[5]:5,y[5]:1; the prediction is 1 with probability:0.933417

    可以看到,在完成训练后的这个极简神经网络能够较为准确的预测样本中的数据。

    完整的代码

    完成在的代码可以在 GitHub 上查看:https://github.com/orczhou/ssnn/ 。包括了三个段程序:

    • ssnn_ant.py : 最为基础的上述神经网络的实现
    • ssnn_ant_np.py : 使用numpy对上述实现进行向量化
    • ssnn_ant_tf.py : 使用 TensorFlow 框架实现上述程序

    这里也简单列出相关程序如下(最新代码可以参考上述 GitHub 仓库):

    ssnn_ant.py
    """
    super simple neural networks 
      * only one neuron in only the one hidden layer
      * input x is scalar (one-dimension)
      * using logistic function as the activation function
    
    input layer:
        x: scalar 
    parameters: 
        w: scalar
        b: scalar
    output:
        y \in [0,1] or  p \in {0,1}
    structure:
             
       x ->   w*x + b   ->   logistic function  -> output
            -----------      -----------------
                 |                    |
                 V                    V
             one neuron     activation function
    
    about it:
        it's a simple project for human learning how machine learning 
        by orczhou.com
    """
    import numpy as np
    import math
    
    # function_f: 
    # x   : scalar
    # w   : scalar
    # b   : scalar
    def function_f(x,w,b):  
        return 1/(1+math.exp(-(x*w+b)))
    
    # initial w,b
    w,b = (0,0)
    
    # samples
    x_train = np.array([0,1,2,3,4,5])
    y_train = np.array([0,0,0,0,0,1])
    #y_train = np.array([0,0,0,1,1,1])
    
    # m for sample counts
    m = x_train.shape[0]
    
    iteration_count = 50000
    learning_rate   = 0.01
    cost_reduce_threshold = 0.000001
    
    # Gradient caculate 
    # x_p: x_train
    # y_p: y_train
    # w_p: current w
    # b_p: current b
    def gradient_caculate(x_p,y_p,w_p,b_p):
        gradient_w,gradient_b = (0.,0.)
        for i in range(m):
            gradient_w += x_p[i]*(function_f(x_p[i],w_p,b_p)-y_p[i])
            gradient_b += function_f(x_p[i],w_p,b_p)-y_p[i]
        return gradient_w,gradient_b
    
    def cost_function(w_p,b_p,x_p,y_p):
        c = 0
        for i in range(m):
            y = function_f(x_p[i],w_p,b_p)
            c += -y_p[i]*math.log(y) - (1-y_p[i])*math.log(1-y)
        return c
    
    about_the_train = '''\
    try to train the model with:
      learning rate: {:f}
      max iteration : {:d}
      cost reduction threshold: {:f}
    \
    '''
    print(about_the_train.format(learning_rate,iteration_count,cost_reduce_threshold))
    
    # start training
    cost_last = 0
    for i in range(iteration_count):
        grad_w,grad_b = gradient_caculate(x_train,y_train,w,b)
        w = w - learning_rate*grad_w
        b = b - learning_rate*grad_b
        cost_current = cost_function(w,b,x_train,y_train)
        if i >= iteration_count/2 and cost_last - cost_current<= cost_reduce_threshold:
            print("iteration: {:5d},cost_current:{:f},cost_last:{:f},cost reduce:{:f}".format( i+1,cost_current,cost_last,cost_last-cost_current))
            break
        if (i+1)%(iteration_count/10) == 0:
            print("iteration: {:5d},cost_current:{:f},cost_last:{:f},cost reduce:{:f}".format( i+1,cost_current,cost_last,cost_last-cost_current))
        cost_last = cost_current
    
    print("after the training, parameter w = {:f} and b = {:f}".format(w,b))
    
    for i in range(m):
        y = function_f(x_train[i],w,b)
        p  = 0
        if y>= 0.5: p  = 1
        print("sample: x[{:d}]:{:d},y[{:d}]:{:d}; the prediction is {:d} with probability:{:4f}".format(i,x_train[i],i,y_train[i],p,y))

    使用NumPy向量化 ssnn_ant_np.py
    """
    super simple neural networks(using numpy,snn.py not using numpy)
      * only one neuron in only the one hidden layer
      * input x is scalar (0-dimension)
      * using logistic function as the activation function
    
    input layer:
        x: scalar
    parameters:
        w: scalar
        b: scalar
    output:
        y \in [0,1] or  p \in {0,1}
    structure:
    
       x ->   w*x + b   ->   logistic function  -> output
            -----------      -----------------
                 |                    |
                 V                    V
             one neuron     activation function
    
    about it:
        it's a simple project for human learning how machine learning
        by orczhou.com
    """
    import numpy as np
    import math
    
    # function_f:
    # x   : scalar or ndarray
    # w   : scalar
    # b   : scalar
    def function_f(x,w,b):
        return 1/(1+np.exp(-(x*w+b)))
    
    # initial w,b
    w,b = (0,0)
    
    # samples
    x_train = np.array([0,1,2,3,4,5])
    y_train = np.array([0,0,0,0,0,1])
    #y_train = np.array([0,0,0,1,1,1])
    
    # m for sample counts
    m = x_train.shape[0]
    
    iteration_count = 50000
    learning_rate   = 0.01
    cost_reduce_threshold = 0.000001
    
    # Gradient caculate
    # w_p: current w
    # b_p: current b
    def gradient_caculate(w_p,b_p):
        gradient_w = np.sum((function_f(x_train,w_p,b_p) - y_train)*x_train)
        gradient_b = np.sum(function_f(x_train,w_p,b_p) - y_train)
        return gradient_w,gradient_b
    
    def cost_function(w_p,b_p,x_p,y_p):
        hat_y = function_f(x_p,w_p,b_p)
        c = np.sum(-y_p*np.log(hat_y) - (1-y_p)*np.log(1-hat_y))
        return c/m
    
    about_the_train = '''\
    try to train the model with:
      learning rate: {:f}
      max iteration : {:d}
      cost reduction threshold: {:f}
    \
    '''
    print(about_the_train.format(learning_rate,iteration_count,cost_reduce_threshold))
    
    # start training
    cost_last = 0
    for i in range(iteration_count):
        grad_w,grad_b = gradient_caculate(w,b)
        w = w - learning_rate*grad_w
        b = b - learning_rate*grad_b
        cost_current = cost_function(w,b,x_train,y_train)
        if i >= iteration_count/2 and cost_last - cost_current<= cost_reduce_threshold:
            print("iteration: {:5d},cost_current:{:f},cost_last:{:f},cost reduce:{:f}".format( i+1,cost_current,cost_last,cost_last-cost_current))
            break
        if (i+1)%(iteration_count/10) == 0:
            print("iteration: {:5d},cost_current:{:f},cost_last:{:f},cost reduce:{:f}".format( i+1,cost_current,cost_last,cost_last-cost_current))
        cost_last = cost_current
    
    print("after the training, parameter w = {:f} and b = {:f}".format(w,b))
    
    for i in range(m):
        y = function_f(x_train[i],w,b)
        p  = 0
        if y>= 0.5: p  = 1
        print("sample: x[{:d}]:{:d},y[{:d}]:{:d}; the prediction is {:d} with probability:{:4f}".format(i,x_train[i],i,y_train[i],p,y))

    使用TensorFlow实现该功能

    这里也是使用 TensorFlow 对上述问题中的数据进行训练并预测。详细代码和 TensorFlow 输出参考小结“TensorFlow 代码”和“TensorFlow的输出”。

    这里对其训练结果做简要的分析。在输出中,可以看到训练后的参数分别是:\( w = 1.374991 \quad b = -5.9958787 \),那么对应的预测表达式为:

    $$ \frac{1}{1+e^{-(w*x+b)}} $$

    代入 \( x = 1 \),其计算结果为:\( np.float64(0.009748092866213252) \),这与 TensorFlow 输出的 \( [0.00974809] \) 是一致的,这也验证了训练程序其实现与理解的事完全一致的。

    TensorFlow 代码 ssnn_ant_tf.py
    import tensorflow as tf
    import numpy as np
    
    tf.random.set_seed(1)
    X_train = np.array([[1], [2], [3], [4], [5],[6]], dtype=float)
    y_train = np.array([[0], [0], [0], [0], [1],[1]], dtype=float)
    
    model = tf.keras.Sequential([
        tf.keras.layers.Input(shape=(1,)),
        tf.keras.layers.Dense(units=1, activation='sigmoid')
    ])
    
    # model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.1), loss='binary_crossentropy', metrics=['accuracy'])
    
    model.fit(X_train, y_train, epochs=1000, verbose=0)
    model.summary()
    
    model.evaluate(X_train,  y_train, verbose=2)
    
    predictions = model.predict(X_train)
    print("Predictions:", predictions)
    
    for layer in model.layers:
        weights, biases = layer.get_weights()
        print("weights::", weights)
        print("biases:", biases)
    TensorFlow的输出
    Model: "sequential"
    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
    ┃ Layer (type)                         ┃ Output Shape                ┃         Param # ┃
    ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩
    │ dense (Dense)                        │ (None, 1)                   │               2 │
    └──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
     Total params: 4 (20.00 B)
     Trainable params: 2 (8.00 B)
     Non-trainable params: 0 (0.00 B)
     Optimizer params: 2 (12.00 B)
    1/1 - 0s - 32ms/step - accuracy: 1.0000 - loss: 0.1856
    1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 10ms/step
    Predictions: 
     [[0.00974809]
     [0.03747462]
     [0.13343701]
     [0.37850127]
     [0.7066308 ]
     [0.90500087]]
    weights:: [[1.374991]]
    biases: [-5.9958787]

    补充说明

    一个一般的前馈神经网络(FNN)通常至少需要一个隐藏层,并且在隐藏层有多个神经元。一个具有多个神经元的多层网络的结构和训练,其复杂度会高很多,后续会再做介绍。本文实现代码虽然只有99行代码,去掉注释只有70行代码,但麻雀虽小、五脏俱全,包含了梯度下降的实现、链式法则的应用等,如果理解了该示例,则可以很好帮助开发者打好基础,以便更好的理解更为复杂的神经网络的训练。

    此外,在计算中省略了一些求导计算,其中略微有一些复杂度的是 \( \frac{\partial L}{\partial \hat{y}} * \frac{\partial \hat{y}}{\partial z} \),感兴趣的可以自行补全。


  • 标题:Azure SQL Database 正式原生支持向量类型; Aurora PostgreSQL Limitless Database 正式GA发布; veDB MySQL 版在广州开服

    重要更新

    Amazon Aurora PostgreSQL Limitless Database 正式GA发布,支持 Serverless 的水平扩展能力,可以非常好的扩展数据库的并发写入能力。该功能自去年AWS Re:Invent发布,很快就是新的一年的Re:Invent,终于正式GA了  [2] 

    Azure SQL Database 正式原生支持向量类型数据的存储与搜索,并支持便捷的与相关生态(如 LangChain 等)工具进行集成。 [1] 

    更新详情

    阿里云
    • ((11-04)) RDS SQL Server支持所有版本的异地备份能力,可以自动将数据备份到另一个地域,可用于监管或容灾恢复等场景。[4]
    Azure(微软云)
    • 托管 PostgreSQL 服务支持PostgreSQL 17 版本  18 
    GCP(谷歌云)
    • ((2024-11-04)) Cloud SQL支持实例备份大小的查看 [5] 
    Oracle云
    • ((2024-11-07)) 改进了 Oracle 数据库统一审计跟踪功能 [8]
    火山云(字节)
    • ((2024-11-01)) 云数据库 veDB MySQL 版在华南1(广州)地域正式开服售卖。[9]
    AWS(亚马逊云)
    • ((2024-10-31)) Aurora MySQL 的 RDS Data API 支持所有 Performance Insights 视图 [16]
    • ((2024-10-31)) Aurora PostgreSQL Limitless Database 预览发布 [17]

    参考链接