¿Hay ejemplos de un uso sofisticado de delegados en una IA?

¿Cuál es realmente el caso de uso de un delegado?

Va así en mi opinión;

Se utiliza cuando el usuario desea recibir una notificación cuando se produce un “evento” específico.

Esto ocurre la mayor parte del tiempo fuera del control del usuario. Los sistemas gestionados por subprocesos, los sistemas de caja cerrada deben tener una forma de abordar los “eventos”.

¿Qué hace que los delegados se adapten a este propósito? ¿Por qué simplemente no usaríamos punteros de función o interfaces como dependencias?

Es simplemente porque, la mayoría de las veces, los eventos no son dependencias, al menos no deberían serlo en la mayoría de los casos. Cuando lo estén, creo que uno debería usar otras formas que los delegados. El usuario de su sistema no sabría que necesita registrarse para un evento, porque no figura en las dependencias de su clase. Es simplemente un “podría”, no un “deber”.

Otra razón por la que uno podría usar eventos es que puede registrar múltiples manejadores. A diferencia de una dependencia, no necesitaría implementar múltiples derivaciones para implementar un patrón de “cadena de responsabilidad”. Se llamarían todos los registros, usted como usuario simplemente establecería un campo “Manejado” para satisfacer el patrón.

Volviendo al tema, ¿por qué una IA necesitaría eventos (o delegados)? Eso depende mucho de cómo describas una IA. Un sistema de decisión simple probablemente no necesitaría un sistema de gestión de eventos. Sin embargo, un sistema más complejo, como una caja de magia negra, en realidad puede necesitar manejo de eventos.

Los delegados y eventos realmente tienen usos en mi humilde opinión en estos casos;

  • No son necesariamente dependencias, son poderosas
  • Puede suscribirse fácilmente a múltiples manejadores
  • Puede implementar fácilmente el patrón de la Cadena de responsabilidad

Para la mayoría de los otros casos, las dependencias que usan interfaces, otras clases, punteros de función harán el truco.

Lo que estás describiendo es esencialmente modelos de conjunto. Principalmente los uso para abordar debilidades en una técnica particular. Un par de ejemplos al azar:

Estaba tratando de predecir probabilidades donde la gran mayoría de las respuestas correctas eran cero o 1. Tenía un conjunto de datos extremadamente escaso (palabras) y quería usar una representación vectorial. Sin embargo, entrenar un NN con ese vector nunca hubiera funcionado, ya que habría aprendido a intentar producir cero o 1. En cambio, predije primero si la respuesta sería cero o unívoca. Luego predije si la respuesta sería exactamente cero (o 1) o no. Luego utilicé una red neuronal entrenada en las respuestas no extremas. El enfoque funcionó porque cada una de las 3 decisiones podría ser tomada por un especialista con mucha más precisión.

Estaba tratando de predecir algunos eventos increíblemente raros (fraude) y como resultado estaba golpeando un montón de condiciones límite. Construí un algoritmo para ser lo más preciso posible, y luego envolví una red de seguridad en el exterior. Desarrollar un modelo para mantener el complejo bajo control fue mucho más fácil que desarrollar el complejo y al mismo tiempo garantizar que no se arruine espectacularmente.

De segunda mano, pero estaba leyendo el código para un programa de reproducción. Se utilizaron tres modelos diferentes y resultados combinados. Era un poco diferente a los dos ejemplos anteriores en que todos los modelos especializados usaban la misma técnica en lugar de decir que tenían un árbol de decisión como el modelo más externo y las redes neuronales en los nodos.