admin

  • 标题:Neo4j宣布ARR超$2亿 ;IDC报告2024H1中国RDBMS规模为$19.3亿;AWS Aurora/RDS 支持 Graviton4 实例

    重要更新

    下周,AWS 将举行 re:Invent 年度开发者大会,Aurora/RDS 都将发布支持新一代的 ARM 架构自研芯片 Graviton 4 [20] [21]

    Neo4j 宣布其年度经常性收入(ARR)已超过2亿美元,并在过去三年中实现了ARR翻番。Neo4j 在快速扩张的图技术市场中的领导地位,以及最近几年图技术对于提升生成式AI(GenAI)结果的准确性、透明性和可解释性至关重要作用,是增长的核心因素。[1]

    IDC 发布《2024年上半年中国关系型数据库软件市场跟踪报告》,报告称,2024上半年中国关系型数据库软件市场规模为19.3亿美元,同比增长10.7%。其中,公有云关系型数据库规模12.9亿美元,同比增长14.1%;本地部署关系型数据库规模6.4亿美元,同比增长4.2% 。 [2] 

    更新详情
    腾讯云
    • TDSQL-C MySQL 版支持透明数据加密(Transparent Data Encryption,TDE)功能,可满足静态数据加密的合规性要求。[44]
    • TDSQL-C MySQL Serverless 集群的算力配置上下限支持设置为相同算力。[45]
    • TDSQL-C MySQL 版“只读分析引擎”发布了新版本,支持了 bit、enum、set 数据类型数据加载为列存以及在分析引擎中进行查询。[46]
    火山云(字节)
    • 云数据库 SQL Server 白名单开放 0.0.0.0/0 IP 网段,允许所有地址访问;支持通过关联 ECSIP 和关联入方向 IP两种方式绑定 ECS 安全组,更贴近实际使用场景。[15]
    • 云数据库 SQL Server 版正式支持售卖创建 3il 规格的实例 [16]
    AWS(亚马逊云)
    • Aurora 支持 db.r8g 实例类 [20]
    • RDS 支持 db.m8g 和 db.r8g 实例类 [21]
    • RDS 支持 MySQL 8.4 [22]
    • RDS for PostgreSQL、MySQL 和 MariaDB 现支持 M8g 和 R8g 数据库实例 [28]
    • Amazon Q Developer 现可将嵌入式 SQL 从 Oracle 转换为 PostgreSQL [35]
    Azure(微软云)
    • 基于 vCore 的 Azure Cosmos DB for MongoDB 中支持次要用户(secondary users)的读取和读/写权限(预览) [7]
    • 发布适用于 Azure Cosmos DB 的 Visual Studio Code 扩展 (预览)[8]
    GCP(谷歌云)
    • 支持使用 Cloud SQL for PostgreSQL 备份的创建新的 AlloyDB 集群 [10] 
    Oracle云
    • 托管 PostgreSQL 数据库支持只读访问端点 [12]
    • 托管 PostgreSQL 支持对扩展插件的管理 [13]

    参考链接

  • 更进一步,本文将从零构建一个浅层的前馈神经网络,实现手写数字0和1的识别。示例手写数字如下图所示。整体实现包括数据预处理、参数初始化、forward/backword propagation、训练与预测。

    问题描述

    使用 Python ,但不使用任何深度学习框架,编写一个浅层的神经网络实现,识别 MNIST 数据集中的手写数字 0 和 1。


    前置知识

    • 熟悉Python 、NumPy的使用
    • 了解神经网络的表示与forward propagation
    • 了解 backward propagation
    • 了解 MNIST 数据集

    数据说明

    这里的手写数字使用了数据集 MNIST,该数据集有着机器学习界的“果蝇”之称。里面包含了大量经过预处理的手写数字,这里选择其中标记为0或1的图片进行训练。并使用对应的测试集,验证训练的神经网络的效果。

    这里取一张 MNIST 中的图片,以及对应的像素数据,以帮助直观理解其中的数据。MNIST 中的图片数据可以理解为一个如下的 28*28 的数组,其所代表的图片也如下图所示:

    更为具体的,数组中的每一个数值代表了图片中的某个像素的灰度值,0代表黑色,255代表白色,这之间的值则代表介于之间的灰色。

    MNIST 原始数据可以在:“THE MNIST DATABASE of handwritten digits”页面获取。也可以直接使用 Python 中模块keras.datasets获取。本程序使用后者方式获取。

    实现概述

    这里的使用了两层神经网络,即一个隐藏层,一个输出层,因为这是二分类问题,所以输出层使用logistic函数,而隐藏层则使用了 ReLU 作为激活函数。隐藏层的神经元是一个动态参数(超参数),在测试时,可以调整为10~300之间不等。输入层则是,MNIST 的图片,也就是一个28*28个数组。

    这里使用了最为基础的Gradient Descent算法,有时候也被称为Batch Gradient Descent。

    数据预处理

    在 Python 中可以使用 keras.datasets模块便捷的获取 MNIST 的数据集。这里编写了一个简单的函数,将该数据集中0和1相关的图片筛选出来,然后将数组的维度,转化为需要的维度。例如,期望的输入数组的维度为\( (n^{[0]},m) \),其中 \( n^{[0]} \) 表示输入的特性(feature)数量,这里也就是 784(即28*28),\( m \)表示样本个数。

    具体代码如下:

    # return only data lable 0 or 1 from MNIST for the binary classification
    def filter_mnist_data(data_X, data_y):
        data_filter = np.where((data_y == 0) | (data_y == 1))
        filtered_data_X, filtered_data_y = data_X[data_filter], data_y[data_filter]
        r_data_X = filtered_data_X.reshape(filtered_data_X.shape[0],filtered_data_X.shape[1]*filtered_data_X.shape[2])
        return (r_data_X, filtered_data_y)
    
    (train_all_X, train_all_y), (test_all_X, test_all_y) = mnist.load_data()
    (train_X,train_y) = filter_mnist_data(train_all_X, train_all_y)
    (test_X ,test_y ) = filter_mnist_data(test_all_X, test_all_y)
    
    X  = train_X.T
    Y  = train_y.reshape(1,train_y.shape[0])

    超参数的配置

    该程序涉及的超参数(hyper-parameter)包括:隐藏层神经元个数 \( n_1 = 10 \)、学习率 \( \alpha = 0.5 \)、迭代次数等。

    # hyper-parameter; read the comments above for structure of the NN
    n0 = X.shape[0]   # number of input features
    n1 = 10           # nerons of the hidden layer
    n2 = 1            # nerons of the output layer
    iteration_count = 500
    learning_rate   = 0.5

    feature scaling和参数初始化

    为了增加训练的速度,这里对输入进行了“标准化”,将所有的数据,归一化为均值为0、方差为1的数据集。具体的步骤如下:

    # feature scaling / Normalization
    mean = np.mean(X,axis = 1,keepdims = True)
    std  = np.std( X,axis = 1,keepdims = True)+0.000000001
    X  = (X-mean)/std

    注意:实现过程中需要注意的是,如果对输入进行了标准化,那么在预测时也需要对预测的输入进行相同的归一化。所以这里的均值和方差,需要记录下来,以备后续使用。这里给方差额外加了一个非常小的数字,一般是没有必要的,这里是为了防止输入数据全部都相同,即方差为0。

    此外,为了增加训练的速度,也参考业界通用做法,对输入也进行了随机初始化,具体如下:

    # initial parameters: W1 W2 b1 b2 size
    np.random.seed(561)
    W1 = np.random.randn(n1,n0)*0.01
    W2 = np.random.randn(n2,n1)*0.01
    b1 = np.zeros([n1,1])
    b2 = np.zeros([n2,1])

    Forward Propagation / Backward Propagation

    Forward Propagation 总是简单的。Backward Propagation 本身的计算与推导是非常复杂的,这里不打算详述(后续再单独介绍)。这里把 Backward Propagation 的计算结果列举如下。对于输出层:

    $$
    \begin{align}
    dW^{[l]} & = \frac{\partial J}{\partial W^{[l]}} \\
    & = \frac{\partial J}{\partial Z^{[l]}} @ (A^{[l-1]})^T
    \\
    dZ^{[l]} & = \frac{\partial J}{\partial Z^{[l]}} \\
    & = \frac{1}{m}(A^{[l]} – Y)
    \end{align}
    $$

    这里的 @ 表示矩阵乘法符号。 上标 T表示矩阵转置。这里一共两层,故这里的 \( l = 2 \) 。

    对于隐藏层:

    $$
    \begin{align*}
    dW^{[k-1]} & = \frac{\partial J}{\partial W^{[k-1]}} \\
    & = \frac{\partial J}{\partial Z^{[k-1]}} @ (A^{[l-2]})^T &
    \\
    dZ^{[k-1]} & = \frac{\partial J}{\partial Z^{[k-1]}} \\
    & = (W^{[k]})^T @ \partial Z^{[k]} \cdot g\prime(Z^{[k-1]}) &
    \end{align*}
    $$

    因为这里只有一个隐藏层和一个输出层,故这里的 \( k = 2 \);相同的,这里的 @ 表示矩阵乘法符号;这里的 \( \cdot \) 表示对应元素相乘(element-wise);函数 \( g \) 表示 ReLU函数。

    具体的代码实现:

        # forward propagation
        A0 = X
    
        Z1 = W1@X + b1  # W1 (n1,n0)  X: (n0,m)
        A1 = np.maximum(Z1,0) # relu
        Z2 = W2@A1 + b2
        A2 = logistic_function(Z2)
    
        dZ2 = (A2-Y)/m
        dW2 = dZ2@A1.T
        db2 = np.sum(dZ2,axis=1,keepdims = True)
    
        dZ1 = W2.T@dZ2*(np.where(Z1 > 0, 1, 0)) # np.where(Z1 > 0, 1, 0) is derivative of relu function
        dW1 = dZ1@A0.T
        db1 = np.sum(dZ1,axis=1,keepdims = True)

    训练迭代

    每次训练迭代都需要根据样本数据,进行一次上述的 Forward Propagation / Backward Propagation ,然后更新新的参数值,以用于下一次迭代,具体的实现如下:

    cost_last = np.inf # very large data,maybe better , what about np.inf
    for i in range(iteration_count):
        ...
        Forward Propagation / Backward Propagation
        ...
        W1 = W1 - learning_rate*dW1
        W2 = W2 - learning_rate*dW2
        b1 = b1 - learning_rate*db1
        b2 = b2 - learning_rate*db2

    使用测试数据集验证训练效果

    在完成训练后,就可以对测试集中的数据进行验证了。需要注意的是,在前面做了“feature scaling”,这里需要对应将输入数据做对应的处理。将预测结果,与标注数据进行对比,就可以确定该模型的效果了。

    # Normalization for test dataset
    X  = (test_X.T - mean)/std
    Y  = test_y.reshape(1,test_y.shape[0])
    
    Y_predict = (logistic_function(W2@np.maximum((W1@X+b1),0)+b2) > 0.5).astype(int)
    
    for index in (np.where(Y != Y_predict)[1]):
        print(f"failed to recognize: {index}")
        # np.set_printoptions(threshold=np.inf)
        # np.set_printoptions(linewidth=np.inf)
        # print(test_X[index].reshape(28,28))
    
    print("total test set:" + str(Y.shape[1]) + ",and err rate:"+str((np.sum(np.square(Y-Y_predict)))/Y.shape[1]))

    完整的代码

    完整的代码可以参考 GitHub 仓库中的 ssnn_bear.py 脚本:参考。这里张贴当前版本如下:

    """
    super simple neural networks (bear version)
      * input x is matrix 784x1 (where 784 = 28*28 which is MNIST image data)
      * 30 neurons for the only hidden layer, as n^{[1]} = 30
      * output layer: one neuron for classification(logistic)
      * using relu for activation function in hidden layer
    
    input layer:
        x: (shape 784x1)
            X: m samples where m = 12665 , X: 784 x 12665
            as : a^{[0]}: 784 x 12665  n^{[0]} = 784
    hidden layer:
        n^{[1]}:  30
        W^{[1]}: (30,784)   as (n^{[1]},n^{[0]})
        Z^{[1]}: (30,12665) as (n^{[1]},m)
        A^{[1]}: (30,12665) as (n^{[1]},m)
    output layer:
        n^{[2]}: 1
        W^{[2]}: (1,30)     as (n^{[2]},n^{[1]})
        Z^{[2]}: (1,12665)  as (n^{[2]},m)
        A^{[2]}: (1,12665)  as (n^{[2]},m)
    
    output:
        y \in [0,1] or  p \in {0,1}
            Y: (1 x m) ndarray
    structure for only one sample:
          x_1   ->   W*X + B   ->  relu  ->
          x_2   ->   W*X + B   ->  relu  ->  \
          ...   ->     ...     ->     .. ->  -> w*x+b -> logistic
          x_784 ->   W*X + B   ->  relu  ->  /
         ------     --------------------       ------------------
           |                |                          |
           V                V                          V
         input         30 neurons                 one neuron
        feature      relu activation             output layer
    
      By numpy with m samples:
        np.logistic(W2@g(W1@X+b1)+b2) as \hat{Y}: (1 x m) ndarray
    
        dimension analysis:
            W2        : (n2,n1)
            g(W1@X+b1): (n1,m)
                W1 : (n1,n0)
                X  : (n0,m)
                b1 : (n1,1)  with broadcasting to (n1,m)
            b2: (n2,1) with broadcasting to (n2,m)
    
    grad and notaion:
        forward propagation : A1 A2 Z1 Z2
        backward propagation: dW1 dW2 db1 db2
    
        more details:
            Z1 = W1@X  + b1
            Z2 = W2@A1 + b2
            A1 = g(Z1)      -- g     for relu
            A2 = \sigma(Z2) -- sigma for logistic
    
            dW2 = ((1/m)*(A2-Y))@A1.T
                dW2 = dZ2@A1.T  where dZ2 = (1/m)*(A2-Y)
                A2.shape:(1,m) Y.shape:(1,m) A1.T.shape:(n1,m)
                so: dW2.shape: (1,n1)
    
            dW1 = (W2.T@((1/m)*(A2-Y))*g_prime(Z1))@A0.T
                dW1 = dZ1@A1.T
                    where
                        dZ1 = W2.T@dZ2 * g_prime(Z1)
                        g_prime is derivative of relu
                    dW2.shape: (n1,n0)
            note: @ for matrix multiply;   * for dot product/element-wise
    
    Challenges
        1. Understanding the MNIST dataset and labels
        2. Understanding gradient caculate and the gradient descent
        3. Understanding logistic regression loss function and the caculation
        3. Knowing feature normalization
    
    about it:
        it's a simple project for human learning how machine learning
        version ant : scalar input/one neuron/one layer/binary classification
        version bear: vector input/30+1 neurons /two layer/binary classification
        by orczhou.com
    """
    
    from keras.datasets import mnist
    import numpy as np
    
    # return only data lable 0 or 1 from MNIST for the binary classification
    def filter_mnist_data(data_X, data_y):
        data_filter = np.where((data_y == 0) | (data_y == 1))
        filtered_data_X, filtered_data_y = data_X[data_filter], data_y[data_filter]
        r_data_X = filtered_data_X.reshape(filtered_data_X.shape[0],filtered_data_X.shape[1]*filtered_data_X.shape[2])
        return (r_data_X, filtered_data_y)
    
    (train_all_X, train_all_y), (test_all_X, test_all_y) = mnist.load_data()
    (train_X,train_y) = filter_mnist_data(train_all_X, train_all_y)
    (test_X ,test_y ) = filter_mnist_data(test_all_X, test_all_y)
    
    X  = train_X.T
    Y  = train_y.reshape(1,train_y.shape[0])
    
    m = X.shape[1]    # number of samples
    
    # hyper-parameter; read the comments above for structure of the NN
    n0 = X.shape[0]   # number of input features
    n1 = 10           # nerons of the hidden layer
    n2 = 1            # nerons of the output layer
    iteration_count = 500
    learning_rate   = 0.5
    
    # feature scaling / Normalization
    mean = np.mean(X,axis = 1,keepdims = True)
    std  = np.std( X,axis = 1,keepdims = True)+0.000000001
    X  = (X-mean)/std
    
    # initial parameters: W1 W2 b1 b2 size
    np.random.seed(561)
    W1 = np.random.randn(n1,n0)*0.01
    W2 = np.random.randn(n2,n1)*0.01
    b1 = np.zeros([n1,1])
    b2 = np.zeros([n2,1])
    
    # logistic function
    def logistic_function(x):
        return 1/(1+np.exp(-x))
    
    about_the_train = '''\
    try to train the model with:
      learning rate: {:f}
      iteration    : {:d}
      neurons in hidden layer: {:d}
    \
    '''
    print(about_the_train.format(learning_rate,iteration_count,n1))
    
    # forward/backward propagation (read the comment above:"grad and notaion")
    cost_last = np.inf # very large data,maybe better , what about np.inf
    for i in range(iteration_count):
        # forward propagation
        A0 = X
    
        Z1 = W1@X + b1  # W1 (n1,n0)  X: (n0,m)
        A1 = np.maximum(Z1,0) # relu
        Z2 = W2@A1 + b2
        A2 = logistic_function(Z2)
    
        dZ2 = (A2-Y)/m
        dW2 = dZ2@A1.T
        db2 = np.sum(dZ2,axis=1,keepdims = True)
    
        dZ1 = W2.T@dZ2*(np.where(Z1 > 0, 1, 0)) # np.where(Z1 > 0, 1, 0) is derivative of relu function
        dW1 = dZ1@A0.T
        db1 = np.sum(dZ1,axis=1,keepdims = True)
    
        cost_current = np.sum(-(Y*(np.log(A2))) - ((1-Y)*(np.log(1-A2))))/m
        if (i+1)%(iteration_count/20) == 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
        W1 = W1 - learning_rate*dW1
        W2 = W2 - learning_rate*dW2
        b1 = b1 - learning_rate*db1
        b2 = b2 - learning_rate*db2
    
    print("Label:")
    print(np.round( Y[0][:20]+0.,0))
    print("Predict:")
    print(np.round(A2[0][:20],0))
    
    # Normalization for test dataset
    X  = (test_X.T - mean)/std
    Y  = test_y.reshape(1,test_y.shape[0])
    
    Y_predict = (logistic_function(W2@np.maximum((W1@X+b1),0)+b2) > 0.5).astype(int)
    
    for index in (np.where(Y != Y_predict)[1]):
        print(f"failed to recognize: {index}")
        # np.set_printoptions(threshold=np.inf)
        # np.set_printoptions(linewidth=np.inf)
        # print(test_X[index].reshape(28,28))
    
    print("total test set:" + str(Y.shape[1]) + ",and err rate:"+str((np.sum(np.square(Y-Y_predict)))/Y.shape[1]))

    简单统计,代码总计180行,其中注释约90行。

    运行结果说明

    运行该程序会有如下输出:

    try to train the model with:
      learning rate: 0.500000
      iteration    : 500
      neurons in hidden layer: 10
    iteration:    25,cost_current:0.009138,cost_last:0.009497,cost reduce:0.000358
    ...
    iteration:   500,cost_current:0.000849,cost_last:0.000850,cost reduce:0.000001
    failed to recognize: 1749
    failed to recognize: 2031
    total test set:2115,and err rate:0.0009456264775413711

    在本次训练后,对于测试集中的 2115 中图片,识别的错误率为 0.094%,即有两张图片未能够正确识别。这两张图片的编号分别是1749和2031,对应的图像如下:

    最后

    该神经网络在训练后,对于2115张测试集中的图片,仅有2张识别失败。通过该程序,可以看到,神经网络的强大与神奇。

    因为神经网络的 Backward Propagation 的推导非常复杂,本文中直接给出了相关公式,后续将独立介绍该部分内容。如果有任何问题可以留言讨论或公众号后台给作者留言。

    补充记录

    在这个该程序实现中,还遇到了一些其他的问题,记录如下。

    一些报错

    “RuntimeWarning: overflow encountered in exp: return 1/(1+np.exp(-x))”

    当训练或者预测计算过程中,如果出现部分-x值比较大,那么就会出现np.exp(-x)溢出的问题。不过,还好该问题在该场景下并不会影响计算结果,因为这种情况下,1/(1+np.exp(-x))依旧会返回0,而这也是预期中的。

    难以分析

    在这个识别程序中,最后发现有部分图片是难以识别的,而且无论如何调整参数,部分图片还是难以识别。最好的处理方法当然是增加训练数据集,但现实中可能并不总是能够做到。

    而关于模型应该如何优化,这似乎是难以分析,无从入手。

  • 标题:微软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性能退化问题(参考),目前也已经解决。