Pregunta original
Después de haber utilizado XGBoost bastante, está claro que cambiar la tasa de aprendizaje afecta drásticamente al rendimiento del algoritmo. Dicho esto, realmente no puedo entender la justificación teórica para ello. Tiene sentido en el gradient boosting "vainilla", cuando no se utilizan segundas derivadas. Análogamente, no se necesita una tasa de aprendizaje si se utiliza Newton-Raphson para realizar la optimización encontrando los ceros de la derivada de la función de coste.
Pensé que podría tener que ver con asegurar que las actualizaciones que uno hace en cada paso son pequeñas, y por lo tanto la expansión del gradiente a segundo orden es válida, pero me parece que uno podría lograr lo mismo de manera más eficaz mediante la regularización?
Además, los documentos de XGBoost contienen una introducción teórica a XGBoost y no mencionan la tasa de aprendizaje en ninguna parte ( https://xgboost.readthedocs.io/en/latest/tutorials/model.html )
¿Es tan sencillo como "se ha observado experimentalmente que mejora el rendimiento" y, en caso afirmativo, es posible racionalizarlo a posteriori?
Actualización: Casi un año después, he pensado en actualizar mis ideas al respecto y afinar un poco mi pregunta.
Si bien es posible que la necesidad de una tasa de aprendizaje se haya comprobado experimentalmente, me parece probable que la razón por la que es necesaria tenga que ver con el hecho de que XGBOOST asume que la pérdida total $L$ de un clasificador consistente en un clasificador existente $F_{t}(x)$ más un nuevo clasificador $f_{t+1}(x)$ puede escribirse como una expansión de Taylor de $L$ acerca de $F_{t}(x)$ que requiere $f_{t+1}(x)$ para representar una corrección "suficientemente pequeña" para $F_{t}(x)$ que no necesitamos ampliar a un orden demasiado alto.
Hace tiempo que sospecho que el uso de mucha regularización debería solucionar este problema, de ahí que ¿por qué utilizar una tasa de aprendizaje? Otro enfoque podría ser decir que el árbol $f_{t+1}(x)$ que divide el espacio en varias regiones distintas (nodos terminales) $\{R_{j}\}$ produce una constante $\epsilon \cdot w_{j}$ en el $j^{th}$ región. Eligiendo una región $\epsilon$ podemos garantizar que $\epsilon \cdot w_{j}$ será suficientemente pequeño para cualquier partición y cualquier j.
Resulta, sin embargo, que si se sigue la derivación de los documentos XGBOOST pero se adopta este enfoque, y no se utiliza ninguna regularización, el peso $w_{j}^{*}$ debe asignar a la región $R_{j}$ viene dado por
$w_{j}^{*} = - \frac{\sum_{i \in R_{j}}\frac{\partial \ell}{\partial \hat{y}_{i}}\bigg|_{F_{t}(x_{i})}}{\epsilon \sum_{i \in R_{j}}\frac{\partial ^{2}\ell}{\partial \hat{y}_{i}^{2}}}$
en el que $L[F_{t}(x)+f_{t+1}(x)] = \sum_{i=1}^{N}\ell (y_{i}, \hat{y}_{i})=\sum_{i=1}^{N}\ell (y_{i}, F_{t}(x_{i}) + f_{t+1}(x_{i}))$
En otras palabras, si se establece que la salida de cada árbol en cada hoja será una constante $w_{j}$ multiplicado por un número muy pequeño $\epsilon$ , lo suficientemente pequeño como para garantizar que el producto sea siempre pequeño, $w_{j}^{*}$ simplemente compensará, así que cuanto más pequeño hagas $\epsilon$ cuanto mayor sea $w_{j}^{*}$ y el producto permanece inalterado. Crucialmente, el producto no será necesariamente "suficientemente pequeño" para que la serie de Taylor converja rápidamente y justifique la expansión de segundo orden. Sin embargo, si se utiliza un poco de regularización, lo suficiente para detener $w_{j}$ convirtiéndose en infinito y así garantizar que el producto sea siempre pequeño, entonces estás bien.
En esencia, tienes dos enfoques:
- Establecer $\lambda$ sea "muy grande", esto garantizará que $w_{j}^{*}$ es pequeño, por lo que la expansión es válida
- Utilizar un parámetro de velocidad de aprendizaje $\epsilon$ y una pequeña regularización, para garantizar que $w_{j}^{*}$ no puede ser arbitrariamente grande
Suenan igual, a nivel fenomenológico, pero investiguemos la $w_{j}^{*}$ implican. Usando el enfoque 1, sin tener una tasa de aprendizaje, obtenemos (como en los docs de xgboost, enlazados arriba)
$w_{j}^{*}= - \frac{\sum_{i \in R_{j}}\frac{\partial \ell}{\partial \hat{y}_{i}}\bigg|_{F_{t}(x_{i})}}{\lambda + \sum_{i \in R_{j}}\frac{\partial^{2} \ell}{\partial \hat{y}_{i}^{2}}\bigg|_{F_{t}(x_{i})}}$
mientras que si utilizamos también una tasa de aprendizaje, obtenemos
$w_{j}^{*}= - \frac{\sum_{i \in R_{j}}\frac{\partial \ell}{\partial \hat{y}_{i}}\bigg|_{F_{t}(x_{i})}}{\frac{\lambda}{\epsilon} + \epsilon \cdot \sum_{i \in R_{j}}\frac{\partial^{2} \ell}{\partial \hat{y}_{i}^{2}}\bigg|_{F_{t}(x_{i})}}$
Se parecen mucho y, en ambos casos, a medida que se aumenta el grado de regularización, al aumentar $\lambda$ el término de curvatura pierde relevancia. En el caso de que tenga una tasa de aprendizaje, puede conseguir este efecto aumentando $\lambda$ o disminuyendo $\epsilon$ .
Cualquiera de los dos enfoques me parece conceptualmente el mismo, pero ofrecen soluciones ligeramente distintas. Además, en la práctica, la tasa de aprendizaje es quizá el hiperparámetro más importante que hay que afinar en XGBOOST, aunque no he visto a nadie explorar si se podrían obtener resultados igual de buenos afinando más el parámetro de regularización. En concreto, ¿se me escapa algo de estas dos ecuaciones?
Otra actualización: un año más
Gracias a Andreas por su respuesta a continuación, que me llevó a esto.
Dado que se supone que la función de pérdida se aproxima mediante una función cuadrática en $w_{j}$ que es válido si $w_{j}$ es pequeño, sólo tendrá un mínimo (suponiendo que estemos haciendo una minimización de pérdidas). Por tanto, la pérdida evaluada en $\epsilon \cdot w^{*}_{j}$ será mayor que la pérdida evaluada en $w^{*}_{j}$ pero inferior a la pérdida evaluada en $w_{j}=0$ En otras palabras, actualizando su predicción mediante $\epsilon \cdot w^{*}_{j}$ , está garantizado que disminuirá su pérdida de entrenamiento. Si $\epsilon$ es muy pequeño, este proceso se produce muy lentamente, pero si $\epsilon$ es demasiado grande, entonces la serie de Taylor podría no ser válida. El punto clave aquí es que no se trata de encontrar el óptimo $w_{j}$ Se trata de encontrar un $w_{j}$ que garantiza que la pérdida de entrenamiento disminuye en cada iteración.
Creo que la lógica debe ser algo así, pero no puede ser del todo así. Aunque estoy de acuerdo en que si sabemos $w^{*}_{j}$ entonces $\epsilon w^{*}_{j}$ también disminuirá la pérdida de entrenamiento, pero esta lógica me parece circular. Si realmente supiéramos $w^{*}_{j}$ entonces mientras podría multiplicar por $\epsilon$ ¿por qué lo haríamos?
A la inversa, si queremos encontrar el óptimo $w_{j}$ siempre que $w_{j}$ es suficientemente pequeño, no parece correcto encontrar el óptimo $w_{j}$ suponiendo que $w_{j}$ es pequeño, descubrir que no es pequeño y multiplicarlo por un número pequeño para hacerlo pequeño.