2020-09-06

平均

制度化的优势在于可预见性. 
对于行为评价的可期性约束带来的对后果的浮动范围的一个可控选择.

所以它带来的一个问题就是对于超越预期的不期待.

因为从整体上来看,目标的确定性并不要求具体到个体的超越性要求.
设计构建之初的指标化和数值化使得对于目的明确的架构来说,并不对这种above average有更高的期望和要求.

但是事实上的制度实现会往往会使得这种个体要求呈现一种往上浮动的情况.

这个基于的一个条件在于需求和供给的不一直平衡性.

在给定约束和候选的情况下,候选之间的评价标准往往并不跟约束相关的评价标准所有直接关系.

满足需求的一个前置和唯一前提在于满足基本约束即可.
但是这个排序的优先顺序并不是同一个概念.

一个top N的选择并不要求或者说限定N的分布形态.
或者说跟整体的分布形态保持一致.

一个极端但并不算不现实的例子就是,一个无学历需求的岗位所最终确定的是高学历的人.

所以这个事实上的超越性结果来源在于竞争排序的分布形态.

考虑这种学历需求的结构.

理论上来说,这个应该是一个金字塔型结构.
因为无论如何在每个层次,人数只能是减少而不会凭空增多.

那么理想的匹配情况就是每个层级都是相对满足的.
也就是说理论上刚刚好供需平衡.

存在一个向下兼容的情况的话,也就因为这个层级k的无法向本层级以及上一层级做适配.

而无法向上做适配的原因一在于不是适格主体,或者说不具备相应的适配条件.

另一个原因就是递归性的,具有资质但是不具备相应层级的需求.
或者说因为上一层级同样存在这种过度供给的情况.

类似的.

如果把社会的不同侧面看作是这种金字塔群结构的话.
那么一个个体n它可以从属于k个不同的金字塔的不同的阶层i.

对于所处的每一个金字塔结构来说,存在适格和不适格两种状态.

不适格状态的一个引申意义就是,对于不适格的个体j,对应的就是一个连锁的被动适格阶层k的一个潜在不适格处理.

也就是说,j可能向上往一个空闲的阶层跻身,或者向下抢占k所本能占有的下层阶级位置.

数值化以下就是对于个体individual i,一个k作为标识的层级pyramid p序列,以及以m为标示的在某个p_k中的阶层class c.
如果以某种score s表示的话.
一个综合数值化就是\sum p_k * c_m * s_n 

而不适格就意味着至少存在一个项
从p_k *c_m*s_n降为
p_k*c_(m-1) * s_n.

对应的存在递归的m-1层级的另一人从
p_k*c_(m-1) * s_n.变为
p_k*c_(m-2) * s_n.

直至存在一个q使得m-1=0

也就是说一个不适产生的最坏影响是
p_k*s_n * \sum_{q=0}^{q=m-1} c_{m-q}-c_{m-q-1}

即自m阶层以下的每个阶层的相对差额累计.

考虑p不是相对独立而是一个互相影响的交叉动态系统.
比如消费降级的i,减少的score的意义实际上是另外一个p里的需求阶层的缩减.

也就说假设p之间是一个cascade的过程.

那么整体scroe的缩减可能是个非常快速的过程.

但是它必然是一个链条很长的计算序列么?

在考虑有级联的情况下,整体score的数值取决于两个方面.

一个是m.
评价的是饱和层级的高度纵深.
也就是m本身的位置和向下触达的最深饱和层级.

一个是触发波及的阈值.
也就是某个p对另一p的各层级的饱和程度影响.

所以本质上来说,它的结构稳定性取决于每个层级的吸收能力.

考虑一个构造一个稳定系统.

那么前面说了,稳定性来源于每个层级的缓冲吸收能力.

当然,还有层级变动的频次.
少变动的话自然不存在说变迁造成的计算问题.
但这是相对静态的.

而系统一旦动态化,那么就必然需要重新计算均衡点.

如果每个层级的buffer空间都足够的化,那么也还是相对静态化的.
因为不存在溢出的propagate和横向的被动计算.

但是要求每个层级都存在buffer是不太现实的.

从propagate的角度来说,越上层的一旦产生downward,那么其对score减值的影响就越大.

所以从这个角度来说,上层的buffer优先级更优于下层.

而金字塔结构也决定了,相对地即使按照百分比,上层的百分比绝对数值需求也低于下层.
buffer的效率或者说需求更economic一些.

从相邻层级的角度来看,两个层级的绝对数值越接近,那么对应的就要求下层的buffer空间越多.
因为不然的话,就必然继续递归地向下波及.

于是这个要求的就必然是层级之间的数量需要有一个绝对值间的显著差异.
这样才能存在一个相对合理的代价去容纳和阻却影响.

按照这个思路如果简单用幂级的话,也就因为着给定总数的话,层级并不会太多/深.
或者说总体来说,对于大部分不会有太大的差异.

也就是它应该是一个更扁平或者说平均主义的一种金字塔形态.

那么对于p之间的波动影响呢?

如果每个p都是这种平均设计的话,实际上的影响就在于一旦发生挪动时候的计算复杂度.

而这个跟p的cluster密度有关.

一个显而易见的情况就是,如果p的变动只影响自身的话,那么就无所谓波动影响.

所以设计上,要么尽可能地独立p的存在,要么从根本上地限制p的多样性.

p的cluster/多样性越低,那么计算就越简单明了.

所以某种程度上来说,制度化本质上就是一种平均主义的内涵.

因为简单可控的一个便捷实现就是变量和计算尽可能地少和直接.

2020-08-23

问题与问题

最近在用quic-go写个代理.

开始的想法是兼容socks5协议之后,透明地端对端.
只不过传输部分从tcp变为quic.

因为看接口是兼容io.ReadWrite的.
所以最简单的想法就是直接copy到服务端之后再考虑协议解析.

写了一部分之后发现socks5协议其实算是支持重定向的.
response部分带有bind的地址和端口信息.

理论上client端应该是利用这个信息重新连接到指定地址和端口做流量copy的.

这样的话从协议角度,client端还是会利用tcp去连接对应服务端口.
所以从协议角度来说,需要让这段response里的IP/port信息是本地的端口.

也就是一般实现的,socks5的client会在这个response后复用现有连接.

那么这里的一个问题是,服务端可能并不知道这个local listening的端口是什么.

当然,这里可以约定一个固定端口.

但是更flexible的是能够有一个机制适应这端口.

所以无非就是intercept一些协议,把本地端口信息给对端, 然后在原始协议里echo回来.
要么是local端在解析response的时候modify回本地信息.

但这样的话就意味着两端有一个协议上的握手阶段.
以为遵循的是原始socsk5里的握手协定.

当然,实现上可以把modified的response speculate地返回给发起方,然后再去连接对端.
因为实际上如果能正常连接的话,返回的响应内容是预先知道/固定的.

但这里但问题就是,其实就没有必要跟对端但协议也是走socks5了.
因为如果把socks5的整个流程放在本地,local完成之后再起一套新的协议走quic的话就简单很多.

所以目前的做法是在本地走完socks5的流程之后,再简单地把目标host和port通知quic,然后就直接互相copy后续的流量了.

因为目前这个协议是没有做校验/鉴权的.
所以理论上来说从协议角度,可以去连接比如内网的机器.

当然,这个对于socks5的非鉴权模式也是有这个问题.

而这类tunnel服务的另外一个可能更现实一点的问题就是,如果能把tunnel目标的信息部分更改/替换为特定的服务ip端口的话,实际是很容易定点发现的.
因为只要这个服务目标单一,凡是连接过来的都是susceptive的.

连接内容加密的话或者说明文部分特征不明显的话,相对来说问题没那么明显.
但问题可能就是加密协议的白名单机制了.

另外一个问题就是,想tcp这类有状态的协议,通过构造异常中断连接回比较轻松.
以为需要关注的包的数量不会太多.

但是udp的话因为本身无状态,所以如果要track的话成本会比较高.
因为像quic这类encapsulate可以无限做下去,只要还有允许的协议存在.'

所以最坏的情况可能就是udp整个被去掉.

当然,理论上来说也可以把类似udp的逻辑over tcp,同样embed在合法的协议里面.

如果是到这样一个地步的话,可能就是服务注册制了.
未经允许的服务不得运行,保证协议的可读性和可控豁免.

某种程度上目前的网站备案制就是了.
像云服务上未备案的对应http服务等.

这些其实没什么好说的.
毕竟也没有什么解决方案.

只是个纯粹问题.

另外一些就是关于go本身的一些体验或者说不太便利的地方吧.

原则上来说,go的设计会比较适合做服务端尤其是这类网络方面的应用.
因为netpoller和syscall的隐式coroutine调用会使得写的时候认知负担没那么重.

比如如果是java等写网络io,通常需要select配合线程调度去把io尽可能地并发处理起来.
而go则是把这类syscall的G调度suspend,等ready的时候再resume回来.

虽然这类行为在其他语言上也不是不能实现模仿.
但是也只是针对network的一个特殊场景.
以及局限在语言和库提供的表达能力上.

但是像http.get之类的就依赖于库的表现了.
而且从一般调用上来说,即使提供了异步接口,还是需要写一些逻辑去做简单调度.

比如,
// search something
result = http.search()
// audit log
audit.log(event)

其中search是blocking的.
也就是意味着当前线程是被block的.
而一般这个线程会是属于一个有限数量的线程池资源里的一个.
block的结果就意味着可能负载能力的一个限制.

变通的一种方式是
http.server()
    .then(()->audit.log())
这类promise/future的回调方式.

但它本质上也是需要对应blocking的底层是提供了类似epoll这类有限blocking的实现的.
像如果里面涉及到文件io读写的话,又不是pollable的话,就是block谁/哪个线程池的问题了.

而这里的认知负担就在于需要比较清楚一个方法调用的开销和block状态.
以便是否需要做异步化.

这个就是go的syscall调度的隐式coroutine的一点优势了.
runtime层面就会做这些关键调用的suspend和resume.
所以可以比较不用太关心这类资源的使用问题.

但是goroutine的问题在于,它形态上是一样完全异步的过程.
一旦go出去之后是没什么控制权的. 
而有时这种有时需要的.

比如
go rpc(endpoint1)
go rpc(endpoint2)
这种race访问同样服务的不同实例,以期减少/抹掉服务异常导致的tail latency的场景.

你需要得到早返回的一个,同时尽可能地cancel另外一个.
以标准库的方式的话,可能就需要

go rpc(endpoint1,chan1,ctx1)
go rpc(endpoint2,chan2,ctx2)

select {
  case <-chan1: ctx2.cancel()
  case <-chan2: ctx1.cancle()  
}

而这种场景下,其他语言可能就是
promise.race(
  promise.ask(()->rpc(endpoint1)),
  promise.ask(()->rpc(endpoint2))
).join()

当然,后者这里可能只是库封装程度的问题.

但是考虑如果要在go里实现类似的风格的话.
你需要额外的ctx和chan对象,或者合并为一个struct.

所以最终形态可能是
ctx := ...
promise = Go(func(){rpc(endpoint)},ctx)

如果还需要又返回值和异常信息的话,ctx需要带的东西会更多.

目前标注库里的context接口是之后err和一个等价join/wait的Done() channel的.

所以如果要cover场景的话,至少还得扩展出cancel和value等部分.

而更麻烦的一点就在于,go没有范型 .
所以ctx对不同value要么需要单独适配,要么一个interface做type assert.

以及标准的error结构更多只是一个message的作用,你需要有其他机制/风格去带上堆栈信息.
比如直接堆栈成string带过去.
或者有在err的时候附带print stacktrace的风格.

当然,这里的范型问题只是个编译器问题.
就目前来说go的compiler生成的代码也不少.
做一个类型生成应该也不是太大的问题.

就像现在实际上对每个struct的value function都有生成一个对应的pointer value的版本的.
只要有用到的话.

由于没有运行期动态生成代码的方式,所以实际做类型擦除之类的应该也没什么问题.
毕竟像interface本身实现的机制就有点类似了.

其他的一些认知负担可能就是pass by value的一些点了.

因为如果pass by value,那么调用之间都是copy by value的.
像有深度调用链条,而每一层只需要一部分的就有可能逐步地下层少一些字段/小一些的结构.
所做的只是栈上/gstack上的动作.

理论上来说除了一些特殊的slice/map/chan之类的对象的话,其他都可以栈上解决.
没有/比较少gc的问题.

但是因为前面一些问题的存在,直观上写不逃逸的代码会比较麻烦或者说恶心.
尤其像匿名function,需要多一层参数传递.

而且有时候不看compile optimization decision也想不到.

而这么做的效果/代价其实也可能根本划不来.
一个是维护成本/可读性问题.
一个是拷贝的累计代价问题.

所以这个怎么说呢,也是一个问题和解决方案的事情.
大多数时候其实也不太现实.

只不够可能是确实有解决方案存在而已.


2020-07-06

殖民与其他

看到篇文章,谈后疫情时代航天机会的.

文章本身倒没什么,更多的是某种澳大利亚立场,认为航天尤其SpaceX等带来的一些想象力问题.

然后想到的是如果外层空间已经能够商用居住或者至少能够商用了的话.
对于当下的社会现状可能就会有一种根本性的变化吧.

空间上的合理合法的居住隔离.
商业上的空天范围的一层隔离信道.

就像诸多高达背景设定一样.
代表联邦的旧势力和新型阶级的自然隔离.

当然所不同的可能是现实先有了矛盾.

像BLM或者平权运动你很难说是错的.
因为宏观上来说,即使是过度平均主义化,本身也是一种相对良性的发展.

之前还有篇文章谈inefficiency的.
大意是疫情暴露的商业决策上,过于强调效率而忽视了风险配置.

某种程度上来说,这是另一种全球化配置要求.
像供应链的容灾配置架构.

过往的全球化追求的是效率和价格要素的平衡需求.
而inefficiency指责的实际是这种平衡方程的变量要素的过于单一化.

尽管着眼点在于或者说是由于风险因素引出的.

纯粹点来说,就是过往既有的解法在于optimize某个目标.
是一个主动converge的过程.

而这就决定了是有polarize倾向的.

平均主义或者说过度的平均主义从形式上来说是对这种倾向的regularize.

尽管它并不能保证本身或者后果是非optimal的.

但是它本身的问题在于会把解带回到类stochastic的情况.

一个理念或者说一种思想只要不是存在特别明显的漏洞总是能被人们找到合理的解释从而接受的.
甚至于即使存在明显的逻辑上的不自洽,依然能够被人接受的.

因为人的决策是一个复杂的多因素,而且是含有自身以外其他人所不得知的隐藏加权性质的.
而在构成一个群体的时候,更容易地各自消减形成一个看上去可能根本不合理的群体相消之后解局面.

所以你可以看到在即便疫情严重的情况下,也可能还是会有狂热的聚集活动.
即使可能分别属于不同的群体特征.

但因为都是群体性的,所以反映出来的不合理表现其实是各个个体某种合理诉求被消弭之后的情况.

停工停产带来的迫真生活诉求.
闲散人员的消遣诉求.
投机主义的机会主义诉求.

甚至可能是某种政治上的冷血性诉求.

在支撑制造业的口号与企业复工带来的经济人文风险的矛盾.

在本来经济复苏不明朗的情况下,企业很难说能够主动地去承担风险.
或者说对对应风险的抵抗能力是企业能力之外的.

一个是本身的营业利润成本压力.
一方面是人员的人身赔偿风险.

所以对于企业来说,保守的只能是削减开支等待变化.

尤其本身经济在某种程度上已经是到了缺乏创新支持的时候.
有一个合理的结构中止,加上可能财政政策上的一些倾向性.
企业尤其制造业在不明朗或者统一步伐的前提下,是很难打破这种囚徒困境的.

而对应的制造业工人作为末端消化者面对的自然是基本的生活问题.

所以即使不太可行,作为以制造业工人为基础的决策倾向来说的话,也只能是推动复工复产.

至于病情方面,如果不能支撑到11月,那在政治层面上就没什么特别的意义.
而反过来说,只要还能支撑到11月,后面能不能继续其实关系不是很大了.

对于racist的支持也是类似的道理.

固然一方面有本来自身的某种stereotype.
但是从宏观的角度来说,制造业工人的这种stereotype可能更为深厚.

那么作为争取者来说,也不太可能去往反方向提倡的.

在这种平权运动的冲击下的是另外几方面的人.

支持,中立,反对和投机的部分.

过激化导致可能是一些有支持立场的往表面中立转化.

毕竟在troll化的当代,你很难用道理划清界限.
第一时间妥协可能是尽早结束争端的唯一解决方式.

在这种情况下,如果一个阵营策略是讨好过激方的话,那么政策承诺上也一定会有一些倾斜.
而这种倾斜对应的可能是这种社交暴力的进一步的维持和增强.

那么对于表面中立的部分来说,即使另一阵营可能也谈不上合适.
但选择非过激阵营的要素位置会有某种程度的倾斜上升.

所以你很难说这个插曲会有什么样的具体影响.

也许有.
也许就只是个插曲,对结果影响并不显著.

而即使最终地,会有某种全球化的重新解构,那应该也是针对多样性/风险规避的重新组织.

在成本控制之外的,对于地域风险依赖的一种偏好.

如果是更为保守的风险偏好的化,那么即便还会有全球化或者说跨国合作常态的化,也会是一些非壁垒性产品的世界工厂配置.

因为只有足够成熟通用低门槛的东西才能够做到elastic的异地部署.

这样的话,在没有排他协议的前提下.
也不能说全球化消失了.
甚至于应该说它增强了.

在本来劳动密集意义上的工业殖民全球化转向一种风险偏好驱动的工业容灾性殖民.

当今的技术细分程度,一旦作为工业附属依赖经济,可能就不是一个容易有第二条路的时代.

2020-06-20

玛利亚之墙

按人口数折算了下几个国家的累计确诊人数比例.
美国巴西是差不多1%,英国0.4%,德国0.2%.

国内官方数据是8w,按16亿折算的话是0.005%.

用这个数据看的话,无论如何国内外是不能相提并论的.

那么基于这个基础上考虑人口流动的策略.

在没有疫苗的前提下,高比例携带群体往低比例携带群体移动的话.
直觉上来说应该是要把低比例部分往上提的.

虽然存在着不通的变种,感染性也许有不太一样的地方.

但从另一个角度来说,相当于把低比例群体的浓度提升了.
这样的话,如果说存在一个爆发阈值的存在.
那么比例的提升就意味着概率的增加.

而从武汉的经验来说,国内大概是经受不住国外这种感染比例的.

至少从人群居住密度来说,是基本要瘫痪的.

以城市住宅楼算,一梯四户,每户三口算.
一层就是12人.
按平均25层算,一栋楼就是175人.

按美国1%的比例的话,基本上高层住宅就要封闭隔离的.

即使按千分之一算,大致也约等于一个小区至少有一例.
这种差不多就是3月份非武汉地区的情况.

所以以目前的防疫观念和制度来说,流入带来的潜在风险是不可控.
或者说不能具有系统性风险的.

而对于流出来说,只要存在回流的情况,那么结果也应该是类似的.
作为一种密切接触的同化过程.

所以从这个角度来说,人员上的流动是不太可能有比较正常化的可能的.

那么在国内外人员交流流动存在成本上升的情况下,作为一个企业来说,operation方面的成本应该也是随之增加的.

所以选项无非就是整体或者某种体系性地整块迁入或者迁出,做成本方面的切割.

对于主营或者运作非决定性依赖国内的,在这种成本无限上升的情况下,所能做的也就只有撤出.
而同样的,对于在国际市场上不能可靠地生存下来的,回流自然也是唯一的选择.

用一个词来形容可能就是内卷.
一种自然地有意无意的泾渭分明的趋势.

或者说某种程度上的被动性地闭关锁国也没有什么太大的问题.

而同样的,在这种前提下,之前的一些国际化一带一路之类的,也存在的类似的问题.

因为本质上来说,这是一种经济利益和社会结构稳定性方面的一个抉择.

这是人事/商业交流方面的.
那么,对于纯物的贸易交流呢?

这个估计依赖于检验检疫方面.
在可能的传播渠道进一步展开的前提下,物的交流受限可能不一定马上受到影响.
但存在着一种不确定的预期.

所谓的黑天鹅.

在这么一种围城的情况下,更多的可能是靠自身内部的经济运转来维持.

但是基于类似的理由以及近期北京的事件情况.
同样存在着一种不确定的中断节奏的可能性.

处于这点考虑的话,风险偏好理性上来说会相对偏向于保守.
因为对于中断或者中止的后果是非常难以控制和预料的.

一方面是由于疫情传播的模式和广泛程度有关.
另一方面是跟防控系统的反应模式有关.

一定程度上来说,可能就是病毒在现实里的一种免疫风暴作用.
在应激和过度应激之间,模糊不定.

如果说低风险偏好是一种共识的话.
那么对于低风险的具体定义可能就是对于中断和中止情况的损失承受能力的.

这种承受能力一方面是资金链的健康程度.
另一方面可能更多的是对于政策变化的生存适应性了.

而后者可能是一种更为微妙的情况.
因为实际上来说,企业对于政策并不是没有反作用能力的.

这样的一个指向结果可能就是更加地国家资本主义形态.

而经济层面的对其他结构体系的作用影响结果,可能并不是一个非常乐观的走向.

2020-06-07

不确定性

看到个视频,大意是个外国人谈自己无意识的种族歧视.

在来到国内之后因为初期语言不通被认为有障碍.
从而认为自己成为了少数族裔而切身感受到了被歧视的处境.

也就是说这里语境里的种族歧视racist和少数族裔minority是有内在关系的.

或者直接地说,少数族裔等同于种族歧视.

这个看起来是有点古怪的.

因为一般来说racist应该是跟某种stereotype有关的.
比如黑人的劳工历史.

在特定历史条件下的特定社会阶层所反映出来的一种固有社会印象.
从而基于这个印象作出了一系列社会性的连锁bias决策.

所以racist应该是跟某种人群的排斥性接受所关联在一起的.

但是如果把minority等价于racist的话,那么就意味着非majority的都是被排斥的.

这个初看是不太妥当和合理的.

但是仔细想下白人至上这类词的话,似乎也不是那么不可理喻.

对非majority的排斥性在于一种社会性身份认同的一个快速筛选过程.

简单地说,人类或者说大多数动物都有某种群聚性领地思维.
对于某个属地而言,对于群体之外的态度是排斥的.

这个主要是因为一种生存资源的独占性需求驱动的.

在人类社会可能就是某种形态的社会资源或者属性.

动物层面对于群体个体的认证是某种生物性的识别特征.
可能是气味也可能是其他.
表面是同属于一个部落的.

而人类社会实际上的识别方式会形式多样一些.
人种肤色这种显见的特色可以是一种直观的区分方式.
语言和口音也可以是一种区分方式.
甚至于citizen的行政级别划分也可以是一种区分方式.

或者其他更微妙的空气化/氛围化的划分方式.

那么基于这种排他性识别,相对于一个大致固定的群体来说.
自然对于某种尺度层面的majority,就存在对应程度的minority.

可以是人种也可以是性向,或者一些用来做排他识别的feature.

如果按照这种排他性作为minority的划分特征的化,说是racist也不算过分.

在这种广义或者可以说更为准确的定义下面.
种族歧视的范围是会别想象的广泛得多的.

比如地域,比如收入层次,比如居住区域.
只要是带有某种积极的权利不对等的划分情况存在的话,理论上都应该可以归纳到这种种族歧视的框架内.

那么反种族歧视的内核就应该对应的是类似平权运动之类的存在.

通过构造一种人为的对抗积极权利不对等的平衡架构.

但一个问题在于,维护这种政治正确带来但社会成本收益是什么.
或者说存在不存在值得不值得.

minority识别系统的存在在于维护保障majority的某种资源占有性.

而这种独占性是不能说一定就有益或者说有弊的.

比如商业上垄断.
甚至于说垄断本身也不一定就是有害的.

而平权的作用在于打破或者说弱化这种独占性.

形式上可能是削弱majority的既得利益,或者增加minority的获得利益.
取决于是零和还是非零和的.

本质上来说,就是一种平均主义的中庸化分配方式/制度.
一个简单的50-50的objective function.

所以这个损益计算取决于具体majority/minority的社会贡献价值体系的数值计算特征.

而实际上的计算会更复杂一些.

因为同一个个体在不通群体维度的majority/minority属性是不同的.
某个维度的平权调整可能或者说必然对其他维度的权值计算产生影响.

而一个平衡解可能本来就是不存在的.

一个例子就是学区学位.
你很难说一个个体,能入学和不能入学,哪个宏观收益会更大.

可能这个问题的本质在于有了太多的复杂的群分方式.
又或者根源上的资源稀缺性,或者说使用效率化.

所以有时候不得不觉得生产力高度发展后的按需分配,这种答案的取巧性.

你不可否认这是一个正确解.
但是可能并不是practical的.

因为它把constrain全部抹去了.

2020-05-05

关于Instagram

最近花了点时间在Instagram上,发觉有几点蛮有意思的.

一个是它的推荐反馈.

本来觉得冷启动的过程会比较漫长,但是意外的给人的感觉是实时反馈的.
也就是你在下滑的时候会发现前面的一些反馈动作在后续的瀑布流里面的权重已经有所提升.

这个挺有意思的.

按说如果是实时反馈的话,一个是对于网络质量其实并没有太大的信心.
而且是不太觉得会有这么高频的交互.

因为如果是实时高频交互的响应时间的保证和瀑布流的流畅性两个方面要做的事情会比较复杂.
推荐结果的响应效率,失败/超时的fallback,render的及时性和候选可替换性等.

很容易长时间的blank page.

所以估计是有一个基础的预处理推荐的集合,ranking之后preload/streaming到客户端.
然后在瀑布流的时候用一个local的ranker去重新排序和反馈/反应当前的偏好序列.

按体验上来说,估计这一个preload的recommend set会有至少7-8屏的量.
因为在之后确实容易出loading的状态.

而如果关掉重新启动app的话,除了首次loading会稍微肉眼可见的长一些之后,后续的几乎是无缝的.

另外一点就是点击推荐图片之后展开的列表项目,后续也是几乎是instant的.
但是交互比如like/save to collection,尤其follow会有一个相对明显的UI层面的状态翻转时间.

估计确实preload的部分会比较多,不然相对follow这种交互的延迟性来说的话,应该会比较惨不忍睹.

然后就是它的throttle/降级机制.

有那么一段时间调教的瀑布流都是各种妹子,日系美甲美发服装美妆.
即使比较倾向性的去激励其他种类的图片的话也很难出后续的推荐.

一个可能自然可能是前面的preload的原因,但另一个也应该是特征太dominant的情形.
一时走不出来.

正要感叹推荐系统的脆弱性的时候,短时间内尝试了比较频繁的整体下拉刷新刷新.

然后发觉貌似各系列的倾向性衰减了.
瀑布流的多样性明显回退 ,或者说丰富了起来.

也就是说,估计这种下拉刷新信号反馈进去了.
或者至少penalty了当前的ranker.

这点倒是意外地蛮实用的.

因为很多时候在其他地方其实很难去做这种explore.
数据的偏向性已经bias在一些高频的所谓兴趣点上了.

而且这个某种程度上是用户可控的.

理论上来说可以用一些自定义个collection去做这种不同的profile.
通过对某一类内容的集中反馈来切换不同的推荐profile形成不同的瀑布流.

当然,如果Instagram来做类似功能的话应该是不会这么生硬的.
就像它的商家橱窗导流交互.

虽然疑心这个可能更早是在Pinterest开创的.

Instagram的一类服饰类商家的图会有一种相对固定风格的摆盘.
也就是以成套服饰包括随身饰品等的形式摊放在一张图里.
然后点击图会对各个成分有个价签label.

一些非商家的话则可能是一些铭牌标签.

总之就是在点击这个二级兴趣反馈之后,会列出这种嵌入度很深的导购方式.

说嵌入式很深是指可能一般人不怎么想的话,去做这种由图片展开的二阶导购的话,会选择直接出一个列表.
然后列举各个部分的链接之类的.

这种做法的也给问题就是在App上需求一个布局空间.
有需求就意味着在有限的移动屏幕上需要从其他地方腾挪/干掉一些元素来做这种布局.
而对于这种图片为主的应用来说,如果采用列表方式的话,就意味着可能整个屏幕只能容下这一张图片.

也就是实际上减少了其他的曝光信道.

这个很明显的例子就是Instagram的第三级导购的效果.

在商家图片上一般左下会有一个小的view list的按钮.
点击之后就是商家的其他跟当前不太相关的商品图列.
也就是更接近传统的商品列表的模式.

在这种模式下是几乎直接占据了一半的空间的.

当然以Instagram本身的层次来说倒是没什么太大的问题.
因为这已经是三级兴趣过滤了.

对于大多数第一级来说,后面的存在并不影响explore的效率或者说体验.

所以如果是Instagram来做不同profile的切换的话,可能会选择一种更符合直觉展开或者说破坏感没那么明显的方式.

比如通过信号反馈的连续性/偏差分布来看是处于一种专注某类的状态,还是更aggressive的探索浏览方式.
然后隐性地调整ranker.

2020-04-19

多层网络视角

考虑把每个individual看作某个equivalent set的一部分的话.
那么整个图就可以降级为一个次等规模结构的形态.

假设某个equivalent set R有P的概率infect关联节点.
对于infected的节点/equivalent se S来说,会有两个结果.

一个是S内部的一个再感染率.
一个是S对外部的感染概率.

S的外部传播过程是类似上级R的传播模型,递归渗透出去的.

如果这里假设S的内部感染率不影响外部的传播过程的话,那么这个就是一般的传染模型.

但是如果把S的内部感染率作为一个因素考虑的话呢?

原则上来说也是也给一般的传播模型.
因为可以视为是对外部感染率的也给加权修正过程.

复杂点可能是一个动态过程.
因为实际上存在内外两种感染路径.

在内部感染覆盖面积影响外部感染率的情况下,传染就是某种动态函数.

或者说是内部感染变化曲线的一个function composite.
因为外层感染驱动的一个因子被替换为内层感染基数的函数变化.

即原来的P常数变为一个跟内部基数相关的函数.

所以这种情况下,是一个稍微动态的一般传染模型.

但是,如果把S的结构复杂化一些.
比如S是某种由人组成的社群的话.
那么这里就有另外一个维度的图结构.

因为人作为个体I可以是任何组织定义下的S的一个成员.
也就是说,I可以是同时是多个不同S的一个成员.

在这种情况下,传播就类似与一个平行的结构.
只是在不同的图层而已.

这种结构怎么描述呢?

因为不同层次的I所处S会在图层合并演算的时候同时产生内部和外部的感染状态变化.
而对于单个图层的S的感染表达来说,就相当于多了一个没有解释性的特异mutation发生.

一个例子就是对于单图层的表达式来说,演算出来的内外部新增感染节点跟实际的感染节点对不上.
实际的感染数量更多.
而多出来的数量实际上是由另外图层演算出来的.
在做合并演算的时候累加进来的.

那么对于单图层的一个相对generic的描述就应该是
P(t) ~ f(infected(t-1) + mutation(t)), mutation(t) >= 0
t时刻的外部传染性是一个t-1时刻内部感染情况和某个变异函数控制的.

引入mutation的原因在于,如果整个多图层是可以具体描述的话,那么是没必要有单个图层的特性表达的.
因为整个系统是可表达的.

但是实际情况往往是并不能或者说并不确定具有怎么样的也给层次结构.
所以需要一个限定访问的也给一般性描述.

或者说用也给符号去代表这种高密度的关联但不确定的信息.

另外一点就是,从形式上来说,infected可以是一个稍微具有解释性的也给定量描述模型.
而mutation则是对于未知变量的一个approximate.

某种程度上来说可以是对infected描述的一个兜底修正形态.

对这个的一个举例就是所谓的出圈.
也就是某个特定小圈子的流行符号变成一个大众梗的时候.

形式上来说就是一般的小圈子内的传播模型套用,然后加上mutation的作用.
mutation的一个表现形式就是比如某个跨界的节点做了广泛广播的情况.
导致原来的单一传播图层形态变为多层的形式.

所以考虑这一点的话,某种形式上来说也可以解释超级节点的存在.

如果把一个平坦的复杂网络切分成这种分层结构的话,超级节点的存在不过就是这种多S的I的存在.

那么反过来,理论上来说就存在着这么一种情况.
某个I在各个层级中的S都属于一个有限小的集合.
也就是说,从任何一个单一的图层角度看的话,都是某种形态的无影响力或者说小透明.

但是,从理论上来说,只要穿透的图层足够多,是依然可以覆盖住所有节点的.
各个disjoint的S最终union可以是全集.

这里引申的另外一个问题就是,传染是不是可防可控的呢?
或者说信息的传播是不是可控的.

把mutation作为一个不确定性源的话.
那么要是的P是可控的,意味着infected即内部传播基数是任意可控或者说自由操纵的.
这样才能应对mutation的不定变化.

这是对外传播的情况.

对于某个S,存不存在对于其他S的P影响是可控的呢?

因为其他S的P形式上等价于一个合并后的P.
也就是依然可以用
P(t) ~ f(infected(t-1) + mutation(t)), mutation(t) >= 0
描述.

如果要让P是服从控制的话,相当于要能够控制其他S的infected.

这个理论上并不是一定不存在.

把所有S作为一个复杂的互相反馈系统的话,在假定其他infected没有自主调控性质的前提下.
是可能存在一个简化描述是以S的infected为驱动变量的.

但这里有两点.
一个是这个解并不一定都存在.

第二个是实际上每个S自身是带有一定自主性的.
也就是通常来说是应当认为是一个独立系统黑盒表示的.

所以要杜绝外部P对自身内部影响的话.
大体上是不太可能的.

除非是单层网络,也就是把mutation剔除/归零之后的一般传播模型.

这样的话就退化为简单的对内部传染性的控制上了.

牛来餐馆

看了欢迎来龙餐馆. 总的来说,作为一个院线电影,成品多少是有点不太匹配的. 看起来更多像是一部网络大电影. 尤其涉及到一些大场面特效的时候,可以看得出服化道的降本增效. 剧本层面有一些比较有意思或者说闪光点. 就是试图用一个餐馆或者厨师来串起一个比较宏大的叙事题材. 这个可以说是...