← Назад к вопросам

Что такое смещение?

2.2 Middle🔥 181 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Bias (Смещение): параметр и метрика

Термин "bias" в машинном обучении имеет два значения: 1) параметр нейронной сети, 2) компонент ошибки в bias-variance tradeoff. Разберём оба.

1. Bias как параметр (нейронная сеть)

Bias (смещение) — это параметр в нейронной сети который смещает линию решения.

Визуально

БЕЗ bias:                    С bias:
y = w*x                       y = w*x + b

    y                            y
    │     ┌─ линия               │         ┌─ линия
    │    /                       │        /
  0 │───/─────── x             0 │───────/── x
    │  /                         │    /
    │ /                          │   /
    └──────────────              └────────────

     Линия проходит           Линия может быть
     через начало           смещена вверх или вниз

Математика

Без bias (w только):
ŷ = w₁*x₁ + w₂*x₂ + ... + wₙ*xₙ

С bias:
ŷ = w₁*x₁ + w₂*x₂ + ... + wₙ*xₙ + b
           └─ это и есть bias (смещение)

Пример: линейная регрессия

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# Создаём данные
X = np.array([1, 2, 3, 4, 5]).reshape(-1, 1)
y = np.array([2, 4, 6, 8, 10]) + 5  # y = 2*x + 5

model = LinearRegression()
model.fit(X, y)

print(f'Вес (w): {model.coef_[0]:.2f}')      # 2.0
print(f'Смещение (b/bias): {model.intercept_:.2f}')  # 5.0

# Предсказание
y_pred = model.predict(X)
print(f'Для x=1: ŷ = 2*1 + 5 = {y_pred[0]:.1f}')
print(f'Для x=2: ŷ = 2*2 + 5 = {y_pred[1]:.1f}')

# Визуализация
plt.scatter(X, y, label='Истинные данные')
plt.plot(X, y_pred, 'r-', label=f'Модель: y = 2*x + 5')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid()
plt.show()

# Без bias модель не сможет бы отразить этот тренд!
# Она была бы зафиксирована в начале координат (0, 0)

В нейронной сети

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

# Слой с bias (по умолчанию)
layer_with_bias = layers.Dense(10, use_bias=True, activation='relu')
# Это вычисляет: z = W*x + b, потом a = ReLU(z)

# Слой БЕЗ bias (редко используется)
layer_without_bias = layers.Dense(10, use_bias=False, activation='relu')
# Это вычисляет только: a = ReLU(W*x)

# Проверим параметры
model = keras.Sequential([
    layers.Dense(10, input_shape=(5,), use_bias=True),  # Слой 1
    layers.Dense(5, use_bias=True)  # Слой 2
])

model.summary()
# Layer (type)        Output Shape       Param #
# ================================================================
# dense (Dense)      (None, 10)         60      <- (5 весов + 1 bias) * 10 = 60
# dense_1 (Dense)    (None, 5)          55      <- (10 весов + 1 bias) * 5 = 55

# Видим параметры с bias
weights_layer1, bias_layer1 = model.layers[0].get_weights()
print(f'Веса слоя 1: {weights_layer1.shape}')   # (5, 10)
print(f'Bias слоя 1: {bias_layer1.shape}')      # (10,) <- 10 bias параметров

2. Bias-Variance Tradeoff (ошибка смещения)

Это совсем другое значение bias!

Определение

Общая ошибка модели разбивается:

Error = Bias² + Variance + Noise

Где:
Bias² = систематическая ошибка
        (модель не подходит для задачи)
        
Variance = нестабильность
          (предсказания меняются при новых данных)
          
Noise = неконтролируемый шум в данных

Визуально: мишень стрелков

НИЗКИЙ BIAS:            ВЫСОКИЙ BIAS:

  ●      ← Мишень        ●●●●     ← Мишень
●   ●                    ●●●●
● ● ●   Низкий bias         ●●●   Высокий bias
●   ●   (точно!)        ●●●●●
  ●                      ●●●●

Стрелки в среднем        Все стрелы далеко
попадают в центр       от центра

Пример

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

# Данные: y = x² + шум
X = np.linspace(-3, 3, 100).reshape(-1, 1)
y = X**2 + np.random.normal(0, 1, (100, 1))

# Модель 1: ЛИНЕЙНАЯ (HIGH BIAS, LOW VARIANCE)
model_linear = LinearRegression()
model_linear.fit(X, y.ravel())
y_pred_linear = model_linear.predict(X)
error_linear = np.mean((y - y_pred_linear.reshape(-1, 1)) ** 2)
print(f'Линейная модель MSE: {error_linear:.4f}')
print('  → Не подходит для параболы = HIGH BIAS')

# Модель 2: ПОЛИНОМИАЛЬНАЯ степень 2 (LOW BIAS, MEDIUM VARIANCE)
poly2 = PolynomialFeatures(degree=2)
X_poly2 = poly2.fit_transform(X)
model_poly2 = LinearRegression()
model_poly2.fit(X_poly2, y.ravel())
y_pred_poly2 = model_poly2.predict(X_poly2)
error_poly2 = np.mean((y - y_pred_poly2.reshape(-1, 1)) ** 2)
print(f'\nПолиномиальная (степень 2) MSE: {error_poly2:.4f}')
print('  → Идеально подходит = LOW BIAS')

# Модель 3: ПОЛИНОМИАЛЬНАЯ степень 10 (LOW BIAS, HIGH VARIANCE)
poly10 = PolynomialFeatures(degree=10)
X_poly10 = poly10.fit_transform(X)
model_poly10 = LinearRegression()
model_poly10.fit(X_poly10, y.ravel())
y_pred_poly10 = model_poly10.predict(X_poly10)
error_poly10 = np.mean((y - y_pred_poly10.reshape(-1, 1)) ** 2)
print(f'\nПолиномиальная (степень 10) MSE: {error_poly10:.4f}')
print('  → Переобучение = HIGH VARIANCE')

Сравнение двух типов Bias

┌─────────────────────┬────────────────────────────┬────────────────────────┐
│ Aspect              │ Bias (параметр сети)       │ Bias (ошибка)          │
├─────────────────────┼────────────────────────────┼────────────────────────┤
│ Что это             │ Параметр w в y=wx+b        │ Компонент общей ошибки │
│ Значение            │ Число (вес)                │ Error = Bias²+Var      │
│ Обозначение         │ b или intercept            │ Bias²                  │
│ Роль                │ Смещает линию решения      │ Недообучение (fit)     │
│ Как менять          │ Обучение (backprop)        │ Усложни модель         │
│ Пример              │ y = 2x + 5 (5 = bias)      │ Линия vs парабола      │
└─────────────────────┴────────────────────────────┴────────────────────────┘

Практическое использование Bias в коде

Пример 1: Linear Regression

from sklearn.linear_model import LinearRegression
import numpy as np

X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 6, 8, 10])

model = LinearRegression(fit_intercept=True)  # fit_intercept = обучаем bias
model.fit(X, y)

print(f'Коэффициент (вес): {model.coef_[0]}')
print(f'Intercept (bias): {model.intercept_}')

# fit_intercept=False → не обучаем bias (он зафиксирован в 0)
model_no_intercept = LinearRegression(fit_intercept=False)
model_no_intercept.fit(X, y)
print(f'\nБез bias: коэффициент = {model_no_intercept.coef_[0]:.4f}')

Пример 2: Логистическая регрессия

from sklearn.linear_model import LogisticRegression

# Бинарная классификация
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5]])
y = np.array([0, 0, 1, 1])

model = LogisticRegression(fit_intercept=True)
model.fit(X, y)

print(f'Коэффициенты (веса): {model.coef_[0]}')
print(f'Intercept (bias): {model.intercept_[0]}')

# Формула: log_odds = w₁*x₁ + w₂*x₂ + bias

Пример 3: Нейронная сеть (TensorFlow)

import tensorflow as tf

model = tf.keras.Sequential([
    tf.keras.layers.Dense(
        64, 
        activation='relu', 
        use_bias=True,  # ВКЛЮЧАЕМ bias
        bias_initializer='zeros'  # Инициализация bias
    ),
    tf.keras.layers.Dense(
        32, 
        activation='relu', 
        use_bias=True
    ),
    tf.keras.layers.Dense(
        1, 
        activation='sigmoid',
        use_bias=True  # Важен даже в выходном слое
    )
])

model.summary()

# Посмотреть bias параметры
weights, bias = model.layers[0].get_weights()
print(f'\nВеса слоя 1: {weights.shape}')  # (input_dim, 64)
print(f'Bias слоя 1: {bias.shape}')      # (64,)
print(f'Значения bias: {bias[:5]}')  # Первые 5 значений

Почему bias важен

import numpy as np
import matplotlib.pyplot as plt

# Без bias: линия через начало координат
X = np.array([1, 2, 3, 4, 5])
y_without_bias = 2 * X  # y = 2x (нет смещения)

# С bias: линия смещена
y_with_bias = 2 * X + 5  # y = 2x + 5

plt.figure(figsize=(10, 6))
plt.plot(X, y_without_bias, 'r-', label='Без bias: y = 2x')
plt.plot(X, y_with_bias, 'g-', label='С bias: y = 2x + 5')
plt.scatter([0], [0], color='black', s=100, label='Начало координат (0, 0)')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid()
plt.axhline(y=0, color='k', linestyle='-', alpha=0.3)
plt.axvline(x=0, color='k', linestyle='-', alpha=0.3)
plt.show()

print('Видно что:')
print('- Без bias: линия ВСЕГДА проходит через (0, 0)')
print('- С bias: линия может быть смещена')
print('- Для реальных данных почти ВСЕГДА нужен bias!')

Инициализация Bias

# TensorFlow/Keras
model = tf.keras.Sequential([
    # Инициализация нулями (стандарт)
    tf.keras.layers.Dense(64, bias_initializer='zeros'),
    
    # Инициализация малыми значениями
    tf.keras.layers.Dense(64, bias_initializer='random_normal'),
    
    # Инициализация константой
    tf.keras.layers.Dense(64, bias_initializer=tf.keras.initializers.Constant(0.1)),
])

# PyTorch
model = torch.nn.Sequential(
    torch.nn.Linear(10, 64),  # По умолчанию включен bias
    torch.nn.ReLU(),
    torch.nn.Linear(64, 1)
)

# Посмотреть и модифицировать bias
for name, param in model.named_parameters():
    if 'bias' in name:
        print(f'{name}: {param.shape}')
        # Можно изменить инициализацию
        with torch.no_grad():
            param.zero_()  # Обнулить

Когда НЕ использовать Bias

# 1. Когда данные явно проходят через начало
# y = 3x (без смещения известно)
model = LinearRegression(fit_intercept=False)

# 2. Когда хотите упростить модель
# Но обычно это плохая идея!

# 3. Некоторые специальные архитектуры
# Например, некоторые batch normalization слои игнорируют bias

Заключение

Bias (смещение) имеет два значения:

  1. Параметр сети (y = wx + b)

    • Смещает линию решения
    • Обучается во время тренировки
    • НУЖЕН в большинстве случаев
    • Для нейросети: дополнительные параметры
  2. Ошибка смещения (Bias² + Variance)

    • Компонент ошибки предсказания
    • Высокий bias = недообучение
    • Низкий bias = хорошая аппроксимация
    • Баланс между bias и variance

Практический совет:

  • ВСЕГДА используй bias=True в слоях (по умолчанию)
  • Исключение: когда есть веская причина
  • Для понимания: bias = сдвиг функции
Что такое смещение? | PrepBro