机器学习学习笔记-20240927

文章目录

      • 一些简单的指令
      • 数据操作
        • 广播机制
      • 标量,向量,矩阵的相互求导
        • 1. 标量对标量的求导
        • 2. 标量对向量的求导
        • 3. 向量对标量的求导
        • 4. 向量对向量的求导
        • 5. 矩阵对标量的求导
        • 6. 矩阵对向量的求导
      • 链式求导法则YYDS
      • 求出损失函数偏导为0时的最优解w*
      • Softmax回归的损失函数梯度推导
      • 4. 最终梯度公式

本人跟着B站李沐进行学习,卧槽,就感觉教的真的很好,相见恨晚,感觉之前都白学了。

一些简单的指令

nvidia-smi 查看CPU状态
pip install torch1.8.1+cu111 torchvision0.9.1+cu111 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html 我用的是这个安装 pytorch,
python --version 查看python版本
conda env list 查看虚拟环境列表
conda create -n study python=3.8 创建名为study的环境
cd g: 打开G盘
jupyter notebook

数据操作

广播机制

在这里插入图片描述
把张量不一样的也进行相加处理,挺牛的。
如果数组的维度不同,较小的数组会在较大数组的前面添加维度,直到两者维度相同。
如果某个维度的大小不相同,且其中一个数组的大小为 1,较小数组会沿着该维度重复。
如果某个维度的大小不相同且都不为 1,则无法进行广播,会引发错误。

标量,向量,矩阵的相互求导

在这里插入图片描述

1. 标量对标量的求导
  • 定义:如果有两个标量函数 f ( x ) f(x) f(x) g ( x ) g(x) g(x),则 f f f 关于 g g g 的导数为:
    d f d g \frac{df}{dg} dgdf
2. 标量对向量的求导
  • 定义:如果 f ( x ) f(\mathbf{x}) f(x) 是标量函数, x \mathbf{x} x n n n-维向量,则 f f f 相对于 x \mathbf{x} x 的导数为梯度向量:
    ∇ x f = ( ∂ f ∂ x 1 , ∂ f ∂ x 2 , … , ∂ f ∂ x n ) \nabla_{\mathbf{x}} f = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \ldots, \frac{\partial f}{\partial x_n} \right) xf=(x1f,x2f,,xnf)
3. 向量对标量的求导
  • 定义:如果一个向量函数 F ( x ) \mathbf{F}(x) F(x) 的每个分量都是标量 x x x 的函数,则其导数为:
    d F d x = ( d F 1 d x , d F 2 d x , … , d F n d x ) \frac{d\mathbf{F}}{dx} = \left( \frac{dF_1}{dx}, \frac{dF_2}{dx}, \ldots, \frac{dF_n}{dx} \right) dxdF=(dxdF1,dxdF2,,dxdFn)
4. 向量对向量的求导
  • 定义:如果 F ( x ) \mathbf{F}(\mathbf{x}) F(x) 是一个从 n n n-维向量到 m m m-维向量的函数,则导数为雅可比矩阵:
    J = [ ∂ F ∂ x ] = [ ∂ F 1 ∂ x 1 ⋯ ∂ F 1 ∂ x n ⋮ ⋱ ⋮ ∂ F m ∂ x 1 ⋯ ∂ F m ∂ x n ] J = \left[ \frac{\partial \mathbf{F}}{\partial \mathbf{x}} \right] = \begin{bmatrix} \frac{\partial F_1}{\partial x_1} & \cdots & \frac{\partial F_1}{\partial x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial F_m}{\partial x_1} & \cdots & \frac{\partial F_m}{\partial x_n} \end{bmatrix} J=[xF]= x1F1x1FmxnF1xnFm
5. 矩阵对标量的求导
  • 定义:如果一个矩阵 M ( x ) \mathbf{M}(x) M(x) 的每个元素都是标量 x x x 的函数,则其导数是一个相同维度的矩阵:
    d M d x = [ d M 11 d x ⋯ d M 1 n d x ⋮ ⋱ ⋮ d M m 1 d x ⋯ d M m n d x ] \frac{d\mathbf{M}}{dx} = \begin{bmatrix} \frac{dM_{11}}{dx} & \cdots & \frac{dM_{1n}}{dx} \\ \vdots & \ddots & \vdots \\ \frac{dM_{m1}}{dx} & \cdots & \frac{dM_{mn}}{dx} \end{bmatrix} dxdM= dxdM11dxdMm1dxdM1ndxdMmn
6. 矩阵对向量的求导
  • 定义:当矩阵 M ( x ) \mathbf{M}(\mathbf{x}) M(x) 的每个元素都是向量 x \mathbf{x} x 的函数时,求导结果是一个由雅可比矩阵组成的三维张量。

这些求导关系是理解多变量函数变化和优化算法的基础,广泛应用于解析力学、量子力学和机器学习等领域。

链式求导法则YYDS

在这里插入图片描述

求出损失函数偏导为0时的最优解w*

在机器学习中,求解最优参数 w ∗ w^* w 通常是通过使损失函数对参数的偏导数为 0 来实现的,这意味着我们需要找到损失函数的最小值或极小值点

1. 损失函数的定义

设损失函数为 L ( w ) L(w) L(w),它表示模型预测与实际值之间的差异。最常见的损失函数包括平方损失(用于回归)和交叉熵损失(用于分类)。

例如,对于线性回归中的平方损失函数:
L ( x , y , w ) = 1 2 ∑ i = 1 n ( y i − x i T w ) 2 L(\mathbf{x},y ,w) = \frac{1}{2} \sum_{i=1}^n (y_i - \mathbf{x}_i^T w)^2 L(x,y,w)=21i=1n(yixiTw)2
其中, x i \mathbf{x}_i xi 是第 i i i 个样本的输入, y i y_i yi 是第 i i i 个样本的真实输出, w w w 是模型的参数。

2. 对参数 w w w 求偏导

我们对损失函数 L ( w ) L(w) L(w) 关于参数 w w w 求偏导数,得到梯度 ∇ w L ( w ) \nabla_w L(w) wL(w)。例如,对于平方损失函数,其梯度为:
∇ w L ( w ) = − ∑ i = 1 n ( y i − x i T w ) x i \nabla_w L(w) = -\sum_{i=1}^n (y_i - \mathbf{x}_i^T w) \mathbf{x}_i wL(w)=i=1n(yixiTw)xi

3. 设置梯度为 0

为了找到损失函数的极小值点,我们需要让梯度为 0:
∇ w L ( w ) = 0 \nabla_w L(w) = 0 wL(w)=0
将上面的梯度公式代入,得到:
∑ i = 1 n ( y i − x i T w ) x i = 0 \sum_{i=1}^n (y_i - \mathbf{x}_i^T w) \mathbf{x}_i = 0 i=1n(yixiTw)xi=0

4. 解方程求 w ∗ w^* w

通过解上面的方程,我们可以得到最优解 w ∗ w^* w

我们来详细求解方程:
∑ i = 1 n ( y i − x i T w ) x i = 0 \sum_{i=1}^n (y_i - \mathbf{x}_i^T w) \mathbf{x}_i = 0 i=1n(yixiTw)xi=0

  1. 将方程展开
    将括号展开,可以得到:
    ∑ i = 1 n y i x i − ∑ i = 1 n ( x i T w ) x i = 0 \sum_{i=1}^n y_i \mathbf{x}_i - \sum_{i=1}^n (\mathbf{x}_i^T w) \mathbf{x}_i = 0 i=1nyixii=1n(xiTw)xi=0

其中, x i T w \mathbf{x}_i^T w xiTw 是标量, x i \mathbf{x}_i xi 是向量。因此,我们可以重写第二项为:
∑ i = 1 n y i x i − ∑ i = 1 n x i x i T w = 0 \sum_{i=1}^n y_i \mathbf{x}_i - \sum_{i=1}^n \mathbf{x}_i \mathbf{x}_i^T w = 0 i=1nyixii=1nxixiTw=0
2. 移项
∑ i = 1 n y i x i = ∑ i = 1 n x i x i T w \sum_{i=1}^n y_i \mathbf{x}_i = \sum_{i=1}^n \mathbf{x}_i \mathbf{x}_i^T w i=1nyixi=i=1nxixiTw
3. 将求和写为矩阵形式
X \mathbf{X} X 是输入数据矩阵,其每一行为 x i T \mathbf{x}_i^T xiT,即:
X = [ x 1 T x 2 T ⋮ x n T ] \mathbf{X} = \begin{bmatrix} \mathbf{x}_1^T \\ \mathbf{x}_2^T \\ \vdots \\ \mathbf{x}_n^T \end{bmatrix} X= x1Tx2TxnT

此时,向量 y \mathbf{y} y 表示输出:
y = [ y 1 y 2 ⋮ y n ] \mathbf{y} = \begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_n \end{bmatrix} y= y1y2yn

所以, ∑ i = 1 n y i x i \sum_{i=1}^n y_i \mathbf{x}_i i=1nyixi 可以写作 X T y \mathbf{X}^T \mathbf{y} XTy,而 ∑ i = 1 n x i x i T \sum_{i=1}^n \mathbf{x}_i \mathbf{x}_i^T i=1nxixiT 可以写作 X T X \mathbf{X}^T \mathbf{X} XTX。方程变为:
X T y = X T X w \mathbf{X}^T \mathbf{y} = \mathbf{X}^T \mathbf{X} w XTy=XTXw

  1. 求解 w w w
    假设 X T X \mathbf{X}^T \mathbf{X} XTX 是可逆的,我们可以两边同时乘以 ( X T X ) − 1 (\mathbf{X}^T \mathbf{X})^{-1} (XTX)1,得到:
    w = ( X T X ) − 1 X T y w = (\mathbf{X}^T \mathbf{X})^{-1} \mathbf{X}^T \mathbf{y} w=(XTX)1XTy

这就是线性回归中通过最小二乘法求解得到的最优解 w ∗ w^* w
如果 X T X \mathbf{X}^T \mathbf{X} XTX 不可逆,可能需要使用正则化等方法来处理。
w ∗ = ( X T X ) − 1 X T y w^* = (\mathbf{X}^T \mathbf{X})^{-1} \mathbf{X}^T \mathbf{y} w=(XTX)1XTy

5. 数值优化方法

当损失函数不能直接求解闭式解时,可以使用数值优化算法,比如梯度下降法或牛顿法。梯度下降法通过反复更新参数 w w w 来逼近最优解,更新公式为:
w t + 1 = w t − η ∇ w L ( w t ) w_{t+1} = w_t - \eta \nabla_w L(w_t) wt+1=wtηwL(wt)
其中 η \eta η 是学习率。

Softmax回归的损失函数梯度推导

在这里插入图片描述
来源:B站https://www.bilibili.com/video/BV1K64y1Q7wu/?p=2&spm_id_from=pageDriver&vd_source=591a381cfce5c2eccb909df0428d1ee4评论sudo_rm_-rf

  1. Softmax函数的定义
    假设我们有一个输入向量 z = [ z 1 , z 2 , … , z n ] \mathbf{z} = [z_1, z_2, \dots, z_n] z=[z1,z2,,zn],经过Softmax变换后的输出是:
    y ^ i = e z i ∑ j = 1 n e z j \hat{y}_i = \frac{e^{z_i}}{\sum_{j=1}^{n} e^{z_j}} y^i=j=1nezjezi
    其中, y ^ i \hat{y}_i y^i 表示输入 z i z_i zi 对应的Softmax输出, ∑ j = 1 n e z j \sum_{j=1}^{n} e^{z_j} j=1nezj 是所有输入的指数和,用来归一化概率。

  2. 交叉熵损失函数的定义
    假设我们有一个真实标签向量 y = [ y 1 , y 2 , … , y n ] \mathbf{y} = [y_1, y_2, \dots, y_n] y=[y1,y2,,yn],其中每个 y i y_i yi 0 0 0 1 1 1,表示该样本属于第 i i i 类。交叉熵损失函数的定义为:
    L = − ∑ i = 1 n y i log ⁡ ( y ^ i ) L = -\sum_{i=1}^{n} y_i \log(\hat{y}_i) L=i=1nyilog(y^i)
    这个损失函数用于衡量预测概率分布 y ^ \hat{\mathbf{y}} y^ 和真实标签分布 y \mathbf{y} y 之间的差异。
    交叉熵损失函数(Cross-Entropy Loss)是机器学习和深度学习中用于分类任务的一种常用损失函数,特别是在多分类任务中常与Softmax函数一起使用。它用来衡量模型的输出概率分布和真实标签之间的差异。其本质是计算两个概率分布之间的距离,距离越小,模型的预测越接近真实结果。

对于单个样本,假设真实标签为 y i y_i yi,模型的预测概率为 y ^ i \hat{y}_i y^i,其中 y i y_i yi 表示样本所属的真实类别, y ^ i \hat{y}_i y^i 表示模型预测的该类别的概率。那么,二分类问题的交叉熵损失函数定义为:

L = − [ y log ⁡ ( y ^ ) + ( 1 − y ) log ⁡ ( 1 − y ^ ) ] L = - \left[ y \log(\hat{y}) + (1 - y) \log(1 - \hat{y}) \right] L=[ylog(y^)+(1y)log(1y^)]

这个公式表达了当真实类别为 y = 1 y = 1 y=1 y = 0 y = 0 y=0 时的损失。其含义是:

  • 如果样本的真实标签是 y = 1 y = 1 y=1,我们希望模型预测的 y ^ \hat{y} y^ 越接近 1 损失越小。
  • 如果样本的真实标签是 y = 0 y = 0 y=0,我们希望模型预测的 y ^ \hat{y} y^ 越接近 0 损失越小。

举个例子:假设我们有一个 3 类分类问题,模型的预测概率输出为:
y ^ = [ 0.7 , 0.2 , 0.1 ] \hat{\mathbf{y}} = [0.7, 0.2, 0.1] y^=[0.7,0.2,0.1]

真实的标签为第二类,也就是说真实标签的 one-hot 编码为:(原来独热编码就是这么简单的东西)
y = [ 0 , 1 , 0 ] \mathbf{y} = [0, 1, 0] y=[0,1,0]

交叉熵损失计算为:
L = − ∑ i = 1 3 y i log ⁡ ( y ^ i ) = − [ 0 ⋅ log ⁡ ( 0.7 ) + 1 ⋅ log ⁡ ( 0.2 ) + 0 ⋅ log ⁡ ( 0.1 ) ] = − log ⁡ ( 0.2 ) = 1.609 L = - \sum_{i=1}^{3} y_i \log(\hat{y}_i) = -[0 \cdot \log(0.7) + 1 \cdot \log(0.2) + 0 \cdot \log(0.1)] = -\log(0.2) = 1.609 L=i=13yilog(y^i)=[0log(0.7)+1log(0.2)+0log(0.1)]=log(0.2)=1.609

在这种情况下,由于模型对真实类别的概率预测较低( 0.2 0.2 0.2),所以交叉熵损失较大。模型需要通过优化减少这个损失,使得预测更接近真实标签。

  1. 梯度推导
    为了推导损失函数关于输入 z \mathbf{z} z 的梯度,我们需要分别求 L L L 关于 z \mathbf{z} z 的偏导数。
    好的,我们来逐步推导Softmax回归损失函数的梯度公式。首先,我们先理解Softmax回归的基本概念和损失函数。

3.1. 损失函数的展开

将损失函数 ( L(y, z) ) 展开为:

L ( y , z ) = − ∑ i = 1 K y i log ⁡ ( e z i ∑ j = 1 K e z j ) L(y, z) = -\sum_{i=1}^{K} y_i \log\left(\frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}}\right) L(y,z)=i=1Kyilog(j=1Kezjezi)

可以化简为:

L ( y , z ) = − ∑ i = 1 K y i z i + log ⁡ ( ∑ j = 1 K e z j ) L(y, z) = -\sum_{i=1}^{K} y_i z_i + \log\left(\sum_{j=1}^{K} e^{z_j}\right) L(y,z)=i=1Kyizi+log(j=1Kezj)

3.2. 计算梯度

现在我们需要计算 :

  1. 对第一项求导
    ∂ ∂ z i ( − ∑ k = 1 K y k z k ) = − y i \frac{\partial}{\partial z_i} \left(-\sum_{k=1}^{K} y_k z_k\right) = -y_i zi(k=1Kykzk)=yi

  2. 对第二项求导
    ∂ ∂ z i log ⁡ ( ∑ j = 1 K e z j ) = 1 ∑ j = 1 K e z j ⋅ ∂ ∂ z i ( ∑ j = 1 K e z j ) = e z i ∑ j = 1 K e z j = σ ( z i ) \frac{\partial}{\partial z_i} \log\left(\sum_{j=1}^{K} e^{z_j}\right) = \frac{1}{\sum_{j=1}^{K} e^{z_j}} \cdot \frac{\partial}{\partial z_i}\left(\sum_{j=1}^{K} e^{z_j}\right) = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}} = \sigma(z_i) zilog(j=1Kezj)=j=1Kezj1zi(j=1Kezj)=j=1Kezjezi=σ(zi)

  3. 合并结果
    将两部分结合起来,得到损失函数的梯度:
    ∂ L ∂ z i = − y i + σ ( z i ) \frac{\partial L}{\partial z_i} = -y_i + \sigma(z_i) ziL=yi+σ(zi)

4. 最终梯度公式

因此,Softmax回归损失函数关于 logits ( z_i ) 的梯度为:

∂ L ∂ z i = σ ( z i ) − y i \frac{\partial L}{\partial z_i} = \sigma(z_i) - y_i ziL=σ(zi)yi
只勉强看懂思路,整体看不太懂。害就这样吧。
补充说明

  • 这个推导中使用的交叉熵损失是基于离散的类别标签,因此每个 y j y_j yj 只有一个值为 1 1 1,其余均为 0 0 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1548212.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

昇思MindSpore进阶教程-格式转换

大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧 MindSpore中可以把用于训练网络模型的数据…

打造未来社交:区块链社交DAO的颠覆性开发之路

随着区块链技术的不断发展,去中心化自治组织(DAO)逐渐成为一种创新的社交模式。结合区块链的透明性和不可篡改性,社交DAO为用户提供了一种全新的参与和治理方式,重塑了社交网络的构建与互动方式。本文将探讨区块链社交…

【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(上)

系列文章目录 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上) 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下) 【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(上) 文…

Python画笔案例-066 绘制橙子

1、绘制橙子 通过 python 的turtle 库绘制 橙子,如下图: 2、实现代码 绘制 橙子,以下为实现代码: """橙子.py注意亮度为0.5的时候最鲜艳本程序需要coloradd模块支持,安装方法:pip install coloradd程序运行需要很长时间,请耐心等待。可以把窗口最小化,然后…

教师工作量在线管理服务

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

springAOP和spring事务

AOP 1.简介 Aop面向切面编程:在开发中我们不能直接对已经设计好的代码进行修改(开放-封闭原则,对扩展开放,对修改封闭),解耦 AOP的底层实现为动态代理 * Target(目标对象)&#…

专业网站建设必备

专业网站建设不仅仅是简单的页面搭建,更是一项综合性的工程,需要结合行业特性、用户体验和技术创新,打造一个符合企业需求、独具特色的线上空间。 第一印象至关重要 一个企业网站就如同公司的数字名片,第一印象往往决定了用户是否…

衡石分析平台系统管理手册-功能配置之全局 JS 设置

全局 JS 设置​ 衡石系统提供了全局 JS 设置功能,用户可以通过自定义 JS 代码实现系统的个性化需求,如使用第三方统计工具对系统平台的 PV 、UV 进行监测。 使用场景​ 场景1:增加百度统计​ 下图示例中使用 js 代码引用了百度网站统计功…

MQTT.fx 1.7.1使用说明篇(OneNET-MQTT-API调试)

(代码完美实现)stm32 新版 onenet mqtt物联网(保姆级教程) (代码完美实现)stm32 新版 onenet mqtt物联网(保姆级教程)https://blog.csdn.net/Wang2869902214/article/details/142501323 MQTT.fx 1.7.1使用教程 下载地址 MQ…

深圳龙链科技:全球区块链开发先锋,领航Web3生态未来

【深圳龙链科技】是全球领先的Web3区块链技术开发公司,专注于为全球客户提供创新高效的区块链解决方案。 深圳龙链科技由币安资深股东携手香港领先的Web3创新枢纽Cyberport联袂打造,立足于香港这一国际金融中心,放眼全球,汇聚了华…

部分监督多器官医学图像分割中的标记与未标记分布对齐|文献速递--基于多模态-半监督深度学习的病理学诊断与病灶分割

Title 题目 Labeled-to-unlabeled distribution alignment for partially-supervised multi-organ medical image segmentation 部分监督多器官医学图像分割中的标记与未标记分布对齐 01 文献速递介绍 多器官医学图像分割(Mo-MedISeg)是医学图像分析…

『功能项目』下载Mongodb【81】

下载网址:Download MongoDB Community Server | MongoDB 点击安装即可 选择Custom 此时安装已经完成 桌面会创建图标 检查是否配置好MongoDB 输入cmd命令行 Windows键 R 打开命令行 输入cmd 复制安装路径 复制data路径 如果输出一大串代码即配置mongdb成功

LeetCode 面试经典150题 172.阶乘后的零

题目:给定一个整数 n ,返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * ... * 3 * 2 * 1 思路: 代码: class Solution {public int trailingZeroes(int n) {return n 0 ? 0 : n / 5 trailingZeroes(n / 5);}…

央企办医布局智慧医康养,环球医疗(2666.HK)让养老有“医”靠

投资传奇查理芒格说:“我给自己设定的目标是追求平常人没有的常识。”只有挖掘出市场潜移默化的趋势,才能抓住投资机遇。 当下,资本市场一个被低估的产业趋势是,医疗健康行业大并购时代悄然开启,头部上市公司对并购产…

【Python快速学习笔记01】下载解释器/环境变量配置/PyCharm下载/第一个代码

目录 1.下载python解释器 2.第一个python程序 3.配置解释器环境变量 4.下载开发工具 PyCharm 4.通过PyCharm编写第一个python程序 1.下载python解释器 官网下载,但是下载太慢了,所以直接百度搜了下载了个 Welcome to Python.org 1.官网下载 2.直…

香港科技大学数据建模MSc(DDM)硕士学位项目25/26招生宣讲会-西安专场

香港科技大学数据建模MSc(DDM)硕士学位项目25/26招生宣讲会-西安专场 🕙时间:2024 年10 月12日(周六) 16:00 🏠地点: 西安交大南洋大酒店(交通大学青龙寺店) 行政会议室 🧑‍🎓嘉宾…

VS code 使用 Jupyter Notebook 时显示 line number

VS code 使用 Jupyter Notebook 时显示 line number 引言正文引言 有些时候,我们在 VS code 中必须要使用 Jupyter Notebook,但是默认情况下,Jupyter Notebook 是不显示 Line number 的,这对于调试工作的定位是不友好的,这里我们将介绍如何让 Jupyter Notebook 显示 Line…

反问面试官:如何实现集群内选主

面试官经常喜欢问什么zookeeper选主原理、什么CAP理论、什么数据一致性。经常都被问烦了,我就想问问面试官,你自己还会实现一个简单的集群内选主呢?估计大部分面试官自己也写不出来。 本篇使用 Java 和 Netty 实现简单的集群选主过程的示例。…

为何上海我店平台 能够三年突破两百亿销售额?

在当前全球经济环境充满挑战,消费者普遍持谨慎态度的背景下,我店——这家总部位于上海的创新企业,却以惊人的速度崛起,成为市场中的一股清流。 自2021年8月成立以来,我店凭借其独特的环保积分系统,在短短两…

日本IT-正社员、契约社员、个人事业主该如何选?

正社員:就是「正规社员」的意思,按照公司的规定而直接雇用,而且没有制定雇用期间,基本上是以终身雇用至退休年龄(70岁)为前提。而被雇用的一方需要听从公司的业务命令,包括职位或职场的调迁&…